सवाल बेहतर क्या है? अधिसूचनाडेटासेट किया गया या सूचित करें Item लूप में बदल दिया?


तो मेरे पास एक गतिविधि है RecyclerView और मैं बदलना चाहता हूँ TextView में हर आइटम का RecyclerView बटन दबाकर onClickListener() गतिविधि में

मैं सोच रहा हूं कि प्रदर्शन के मामले में क्या बेहतर है:

  1. उपयोग notifyDataSetChanged लोगों को।
  2. Int के साथ लूप का प्रयोग करें जैसे int I से कम है List.size() कहा पे notifyItemChanged कुछ बार कहा जाएगा।

दोनों मामलों में मैं बुलियन चर बना देता हूं RecyclerView एडाप्टर जिसका उपयोग किया जाता है onBindViewHolder आइटम को अपडेट करने का तरीका जानने के लिए। डिफ़ॉल्ट रूप से यह गलत है और बटन क्लिक करने के बाद यह सच हो जाता है onBindViewHolder आइटम को अलग-अलग तरीके से अपडेट करता है।

मैं यह भी जानना चाहता हूं कि यह दृष्टिकोण बिल्कुल उपयुक्त है या नहीं।


39
2017-11-18 20:05


मूल


notifyDataSetChanged दृश्य दृश्यों को फिर से खींचा जाएगा। अगर मैं आपकी आवश्यकताओं को सही ढंग से समझ रहा हूं, तो मैं इसे चुनूंगा। - dharms
क्या आपने यह देखने के लिए अभी तक रीसाइक्लर व्यू कोड देखा है कि क्या हो रहा है notifyDataSetChanged? पूरी तरह से नाम (और विशेषज्ञता नहीं) के आधार पर यह वही लगता है जो आप चाहते हैं क्योंकि आप एक ही समय में पूरे डेटा सेट को पुन: वैध कर रहे हैं, इसे अलग-अलग आइटमों पर कॉल करने की बजाय, जब तक कि आप कोई विशिष्ट आइटम नहीं बदल रहे हों। - AdamMc331
@ मैकएड 331 मेरा रीसाइक्लिंग व्यू का आइटम टेक्स्टव्यू के साथ कार्डव्यू है। मैं टेक्स्ट दृश्य को सभी दृश्य कार्डों में एक बार में बदलना चाहता हूं। - Daniel


जवाब:


यदि आप बस दृश्य के एक हिस्से को अपडेट कर रहे हैं, तो इसका उपयोग करें notifyItemRangeChanged()या notifyItemChanged() के बजाय notifiyDataSetChanged()। यहां अंतर करना है संरचनात्मक परिवर्तन बनाम आइटम परिवर्तन। यह एंड्रॉइड डेवलपर्स पर है RecyclerView.Adapter प्रलेखन मिला यहाँ

दो प्रकार के परिवर्तनों के बीच मतभेदों पर एक और बोली है:

डेटा परिवर्तन घटनाओं, आइटम परिवर्तन के दो अलग-अलग वर्ग हैं   और संरचनात्मक परिवर्तन। आइटम परिवर्तन तब होते हैं जब एक आइटम में होता है   डेटा अपडेट किया गया लेकिन कोई स्थितिगत परिवर्तन नहीं हुआ है। संरचनात्मक   परिवर्तन तब होते हैं जब आइटम डाले जाते हैं, हटाए जाते हैं या डेटा में स्थानांतरित होते हैं   सेट।

यह उपर्युक्त पृष्ठ से लिया गया है,

यदि आप एक एडाप्टर लिख रहे हैं तो यह हमेशा उपयोग करने के लिए और अधिक कुशल होगा   यदि आप कर सकते हैं तो अधिक विशिष्ट परिवर्तन घटनाएं। पर भरोसा   अंतिम उपाय के रूप मेंडेटाडेट चेंज () को सूचित करें।

तो बस उपयोग को स्पष्ट करने के लिए notifyDataSetChanged() के रूप में अखिरी सहारा, और इसके बजाय खुद से पूछें कि क्या आप इन तरीकों में से किसी एक को पूर्ववत कर सकते हैं, और यदि आप इसके बजाय इसका उपयोग कर सकते हैं:

notifyItemChanged(int)
notifyItemInserted(int)
notifyItemRemoved(int)
notifyItemRangeChanged(int, int)
notifyItemRangeInserted(int, int)
notifyItemRangeRemoved(int, int)

जो समझ में आता है क्योंकि notifyDataSetChanged() डेटा के आधार पर सब कुछ फिर से तैयार करने की कोशिश करेगा और इस पर कोई पिछली धारणा नहीं होगी, जबकि अन्य विधियां सिर्फ बदलावों की तलाश करेंगी। इसका मतलब है कि एडाप्टर को बहुत अधिक काम करना है जो जरूरी नहीं है। यह क्या है notifyDataSetChanged() कर देता है:

यह घटना निर्दिष्ट नहीं करती है कि डेटा सेट के बारे में क्या बदल गया है,   किसी भी पर्यवेक्षकों को यह मानने के लिए मजबूर करना कि सभी मौजूदा वस्तुओं और संरचना   अब मान्य नहीं हो सकता है। लेआउट प्रबंधक को पूरी तरह से पुनर्विचार करने के लिए मजबूर किया जाएगा   और सभी दृश्यमान दृश्यों को रिलायआउट करें।

यह वृद्धिशील या सीमा दृष्टिकोण का उपयोग करने के लिए भी समझ में आता है, क्योंकि आप पाठ बदल रहे हैं, आपको प्रत्येक नए पाठ को प्राप्त करने की आवश्यकता है और जब आप ऐसा करते हैं तो आपको एडाप्टर को यह बताना चाहिए कि आपने इसे बदल दिया है। अब, यदि आप एक बटन क्लिक करते हैं और सभी नए टेक्स्ट मान प्राप्त करते हैं, और एक नई सूची या कुछ बनाते हैं तो भारी कॉल करें notifyDataSetChanged()


51
2017-11-18 22:56



मैंने एक दिन पहले अनुभव किया था कि कॉलिंग अधिसूचित है ItenChanged (x) न केवल x के लिए बाइंडव्यूहोल्डर पर कॉल करता है, बल्कि अन्य वस्तुओं के लिए भी जहां दर्शक का हैश बदल गया है, मुझे अभी भी पता नहीं है कि यह एक एंड्रॉइड बग है या नहीं एक आम व्यवहार। - David


मैं निश्चित रूप से फोन करता हूँ notifyDataSetChanged() यदि सभी डेटा आइटम अब वैध नहीं हैं। जब तुमने फोन किया notifyItemChanged(mPos), यह एक कॉल के बराबर है notifyItemRangeChanged(mPos, 1), और हर बार इसे कहा जाता है, requestLayout() भी कहा जाता है दूसरी तरफ, जब आप कॉल करते हैं notifyDataSetChanged() या notifyItemRangeChanged(0, mList.size()), केवल एक कॉल है requestLayout()

आपका प्रश्न अब होना चाहिए, बेहतर क्या है, एक कॉल notifyDataSetChanged() या notifyItemRangeChanged(0, mList.size())? उस के लिए मेरे पास जवाब नहीं है।


9
2017-11-18 22:01





मैंने देखा है कि notifyItemChanged(mPos) ट्रिगर्स onBindVieHolder इसी स्थिति के लिए भी वर्तमान में यह दिखाई नहीं दे रहा है।

मेरे लिए, इसे सभी तत्वों के लिए एक लूप में बुलाकर अधिक महंगा था notifyDatasetChanged जो केवल दृश्यमानों को फिर से खींचा गया।

तो बड़े डेटासेट से सावधान रहें।


2
2018-06-21 16:57