संक्षेप में, 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());
}
आपको अपनी सूची में कितने प्रकार के दृश्य का उपयोग करना है? –
मैं इसे प्रोग्रामेटिक रूप से करूँगा। –