2016-03-02 21 views
8

से चुने गए आइटम पर अपडेट रीसाइक्लर व्यू के लिए आवश्यक सुझाव, मैं रीसाइक्लिंग व्यू के लिए नया हूं। मेरी आवश्यकता निम्नानुसार है: - मुझे एक वेब सेवा कॉल करना है जो दो सरणी देगा। डेटा के साथ मुझे सूची में दिखाना होगा। इस उद्देश्य के लिए, मैं RecyclerView का उपयोग कर रहा हूं। अन्य सरणी स्थिति की है, जो मैं स्पिनर में दिखा रहा हूं। यह वेब सेवा पेजिनेटेड है। मैंने अंकन जोड़ा है और यह ठीक काम कर रहा है। - जब उपयोगकर्ता स्पिनर से कुछ अन्य तत्व चुनता है, तो मुझे फिर से एक वेब सेवा कॉल करना होगा और रीसाइक्लर व्यू डेटा बदलना चाहिए। वर्तमान में, पृष्ठांकन मैं निम्नलिखित कर रहा हूँ के मामले में, एक बार मैं और अधिक डेटा लगातार पन्नों से मिलती है:एंड्रॉइड: स्पिनर

mAccountListingsAdapter.notifyItemRangeInserted(mAccountListingsAdapter.getItemCount(), mListings.size() - 1); 

और, जब मैं स्पिनर से डेटा बदलने के लिए, मैं कर रहा हूँ निम्नलिखित:

mListings.clear();//Clear the data set 

mAccountListingsAdapter.notifyDataSetChanged();//Call notify data set changed on recycler view adapter 

getAccountListings();//Fetch new data from the web service and display in recycler view 

लेकिन, यह सुझाव दिया जाता है कि, रीसाइक्लिंग व्यू एडाप्टर पर सीधेडेटाडेट चेंज() को सूचित करने के बजाय, प्रदर्शन और एनिमेशन समस्याओं से बचने के लिए, किसी को विशिष्ट NOTifyXXX विधि को कॉल करना चाहिए।

तो, मुझे संदेह है, अगर मैं स्पिनर के onItemSelected() में रीसाइक्लर व्यू एडाप्टर को सूचित करने का अधिकार कर रहा हूं, या इसे बदला जाना चाहिए।

पीएस मैं onItemSelected में निम्नलिखित की कोशिश की:

int size = mListings.size(); 
mListings.clear(); 
mAccountListingsAdapter.notifyItemRangeRemoved(0, size - 1); 

लेकिन तब यह दुर्घटनाग्रस्त हो गया निम्न अपवादों के साथ:

03-02 12:59:41.046: E/AndroidRuntime(4270): java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 4(offset:0).state:5 

उत्तर

4

मुझे लगता है कि notifyItemRangeRemoved यहाँ उपयोग करने के लिए सही तरीका है, लेकिन मूल्य आप दूसरा पैरामीटर के लिए गुजर रहे हैं गलत है। दस्तावेज़ के अनुसार, दूसरा पैरामीटर डेटा सेट से हटाए गए आइटमों की संख्या है, जो आप गुजर रहे हैं वह अंतिम आइटम को हटा दिया गया है।

enter image description here

तो नीचे दिए गए कोड अधिक जानकारी के लिए काम करना चाहिए ठीक

int size = mListings.size(); 
mListings.clear(); 
mAccountListingsAdapter.notifyItemRangeRemoved(0, size); 

देखें: http://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#notifyItemRangeRemoved(int,%20int)

+0

+1 मेरी गलती अभिषेक - मैंने अपना जवाब लिखना शुरू कर दिया और आखिरकार इसे पोस्ट करने से पहले ब्रेक लिया। मेरे साथ ऐसा नहीं हुआ कि किसी और ने इस बीच एक जवाब पोस्ट किया होगा। अभी के लिए, मैं उत्तर प्रदान की गई दूसरी जानकारी के लिए पोस्ट रखूंगा। – Vikram

+0

@ विक्रम निश्चित। कोई बात नहीं। –

1

सबसे पहले, notifyItemRangeRemoved (int, int) के लिए विधि परिभाषा है:

public final void notifyItemRangeRemoved (int positionStart, int itemCount) 

दूसरा तर्क मैं count, positionEnd नहीं है। आपके मामले में आप दूसरे तर्क के रूप में size - 1 पास कर रहे हैं, जब यह size स्वयं होना चाहिए।

int size = mListings.size(); 
mListings.clear(); 
// should be notifyItemRangeRemoved(0, size) 
mAccountListingsAdapter.notifyItemRangeRemoved(0, size - 1); 

दूसरा, notifyDataSetChanged() पर है क्योंकि यह एक rebind और सभी दृष्टिगोचर दृश्यों में से relayout चलाता है सिकोड़ी है। आपके मामले में, जहां दृश्यमान वस्तुओं की संख्या शून्य है, मुझे नहीं लगता कि notifyDataSetChanged() प्रदर्शन को कम क्यों करेगा। यदि आप वस्तुओं को हटाने को एनिमेट कर रहे हैं, तो notifyItemRangeRemoved(0, size) पर जाएं। अन्यथा, यहां पर notifyDataSetChanged() का उपयोग करने के लिए यह ठीक है।

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