2015-01-16 13 views
6

अनुकूलित करने के लिए मेरे पास एक रीसाइक्लिंग व्यू है जिसमें कई आइटम हैं। प्रत्येक आइटम केवल एक टेक्स्ट व्यू है, लेकिन प्रत्येक आइटम के लिए पैडिंग और फ़ॉन्ट शैली बदल सकती है। सबसे कुशल/चिकनी स्क्रॉलिंग के संदर्भ में, क्या मेरे लिए आइटम के प्रत्येक चर (यानी: पैडिंग, टेक्स्ट स्टाइल) के लिए एक अलग लेआउट फ़ाइल बनाने के लिए बेहतर है, या क्या मैं प्रत्येक आइटम के लिए पैडिंग और टेक्स्ट शैली को प्रोग्रामेटिक रूप से सेट कर सकता हूं जब प्रदर्शन दृश्य के बारे में चिंता किए बिना आइटम दृश्य प्राप्त किया जाता है?रीसाइक्लिंग दृश्य/सूची दृश्य

धन्यवाद!

+0

आपको अपनी सूची में कितने प्रकार के दृश्य का उपयोग करना है? –

+0

मैं इसे प्रोग्रामेटिक रूप से करूँगा। –

उत्तर

3

संक्षेप में, onBindViewHolder() विधि में आप जितना कम काम करते हैं, उतनी ही बेहतर आपकी सूची दृश्य स्क्रॉलिंग का प्रदर्शन बेहतर होता है।

सबसे कुशल कार्यान्वयन केवल उस मॉडल से डेटा लेगा जो पास हो गया है और इसे केवल दर्शक धारक के पास सेट करें।

चूंकि यूआई थ्रेड पर onBindViewHolder() विधि में यह सब काम किया जाता है, बाध्यकारी या एंथोएयर थ्रेड से ऑफलोड किए गए किसी भी अतिरिक्त काम को ऑफ़लोड करने से सूची दृश्य प्रदर्शन के लिए फायदेमंद होता है।

उदाहरण के लिए, मान लीजिए कि आपने एक सूची है कि नीचे के रूप में कार्य का एक समूह शामिल है कि:

class Task { 
    Date dateDue; 
    String title; 
    String description; 

    // getters and setters here 
} 

प्रत्येक कार्य एक शीर्षक, वर्णन और इसके साथ एक नियत तारीख सहयोगी है। आपके ऐप की आवश्यकता के रूप में, यदि आज की तारीख देय तिथि से पहले है, तो पंक्ति हरा होनी चाहिए और यदि देय तिथि पारित की जाती है, तो यह लाल होना चाहिए। इसके साथ जुड़े Task ऑब्जेक्ट को दृश्य में सेट करने से पहले कुछ विशेष दिनांक स्वरूपण की आवश्यकता होती है।

वहाँ दो चीजें हैं जो इस onBindViewHolder() में किया जाएगा प्रत्येक पंक्ति के रूप में स्क्रीन पर प्रदान की गई है इस प्रकार हैं:

  • आप सशर्त प्रत्येक तिथि की जाँच करें और यह आज की तारीख के खिलाफ तुलना करने के लिए
  • आप की आवश्यकता होगी की आवश्यकता होगी आवश्यक विनिर्देश में दिनांक देखने के लिए दिनांक फ़ॉर्मेटर लागू करने के लिए:

उदा।

class MyRecyclerView.Adapter extends RecyclerView.Adapter { 

    static final TODAYS_DATE = new Date(); 
    static final DATE_FORMAT = new SimpleDateFormat("MM dd, yyyy"); 

    public onBindViewHolder(Task.ViewHolder tvh, int position) { 
     Task task = getItem(position); 

     if (TODAYS_DATE.compareTo(task.dateDue) > 0) { 
      tvh.backgroundView.setColor(Color.GREEN); 
     } else { 
      tvh.backgroundView.setColor(Color.RED); 
     } 

     String dueDateFormatted = DATE_FORMAT.format(task.getDateDue()); 
     tvh.dateTextView.setDate(dueDateFormatted); 
    } 
} 

उपरोक्त में, प्रत्येक पंक्ति जो प्रस्तुत की जाती है, एक तिथि तुलना की जा रही है। जब हम इसमें थे, तब भी हमने आज की तारीख को स्थिर बनाने के लिए स्वतंत्रता ली - ऑब्जेक्ट सृजन संभवतः सबसे महंगी चीजों में से एक है जो आप onBindViewHolder() में कर सकते हैं ताकि किसी भी अनुकूलन की सराहना की जा सके। इसके अतिरिक्त, Task ऑब्जेक्ट में पारित तिथि उचित प्रारूप में नहीं थी, इसलिए इसे प्रारूप में भी प्रारूपित किया गया है।

हालांकि यह उदाहरण तुच्छ है, यह जल्दी से सूची दृश्य स्क्रॉलिंग को क्रॉल करने में रोक सकता है। ऐसा करने का बेहतर तरीका मध्यस्थ वस्तु को पास करना है, जैसे कि मॉडल देखें जो इसके बजाय वास्तविक व्यावसायिक मॉडल की बजाय दृश्य की स्थिति का प्रतिनिधित्व करता है।

के बजाय गुजर अपने Task एडाप्टर के लिए मॉडल के रूप में, हम एक intermediatary मॉडल TaskViewModel कि बनाया है और एडाप्टर के लिए सेट कर दिया जाता बुलाया पैदा करते हैं। अब एडाप्टर को कोई भी जानकारी भेजने से पहले, सभी कार्य किसी भी व्यू प्रतिपादन लागू होने से पहले किया जाता है।यह आपके RecyclerView पर डेटा भेजने से पहले लंबे समय तक प्रारंभिक समय की लागत पर आता है लेकिन सूची दृश्य प्रदर्शन के बेहतर व्यापार-बंद पर।

यह दृश्य मॉडल के बजाय हो सकता है:

public class TaskViewModel { 
    int overdueColor; 
    String dateDue; 
} 

अब जब देखने के लिए डेटा बाध्य करने के लिए काम सौंपा है, हम वास्तविक दृश्य राज्य है दृश्य मॉडल में प्रतिनिधित्व किया जा रहा है और हमारे यूआई धागा Jank होने के लिए जारी रख सकते हैं मुक्त।

public onBindViewHolder(Task.ViewHolder tvh, int position) { 
    TaskViewModel taskViewModel = getItem(position); 
    tvh.backgroundView.setColor(taskViewModel.getOverdueColor()); 
    tvh.dateTextView.setDate(taskViewModel.getDateDue()); 
} 
+0

धन्यवाद। मैं रीसाइक्लिंग के पीछे अवधारणा को समझता हूं। सवाल मैं पैडिंग के साथ करने के लिए कह रहा हूं, यह सवाल है कि सिस्टम द्वारा प्रत्येक दृश्य को कैसे खींचा जाता है। यदि हर बार दृश्य स्क्रीन पर खींचा जाता है, यदि दृश्य प्रारंभ पैडिंग का अनुरोध करता है तो मेरे द्वारा प्रत्येक पंक्ति के लिए पैडिंग बदलकर मैं प्रदर्शन खो नहीं पाऊंगा। अगर पैडिंग किसी तरह कैश किया जाता है, तो मुझे प्रदर्शन हिट का जोखिम होता है। –

संबंधित मुद्दे