मुझे notifyItemMoved()
विधि का उपयोग करने में कोई समस्या है। ऐसा लगता है कि अप्रचलित विचारों को गलत तरीके से प्रदर्शित किया जा रहा है।रीसाइक्लर देखें भ्रष्टाचार का उपयोग करके देखें भ्रष्ट देखें()
मेरी सूची में इसमें 4 तत्व हैं। मैं क्या करना चाहता हूं आइटम 1 और आइटम 3 के बीच एक स्वैप एनिमेट कर रहा है। आइटम 1 और 3 सही ढंग से स्वैप करें, लेकिन आइटम 2 आइटम 3 पर क्या दिखाता है!
तो सूची से शुरू होता है कुछ इस तरह की तलाश में:
Item 0
Item 1
Item 2
Item 3
और इस तरह समाप्त होता है:
Item 0
Item 3
Item 3 <!-- What the heck has this changed for?
Item 1
मेरे अनुकूलक एक List mProductList
द्वारा समर्थित है।
public void sortBackingListUsingSortingList(List<ProductWrapper> newProductItems) {
Log.e("", "Before:");
for(ProductWrapper wrapper : mProductItems) wrapper.log();
for(int i = 0; i < newProductItems.size(); i++) {
ProductWrapper currentItem = mProductItems.get(i);
ProductWrapper correctItem = newProductItems.get(i);
if(!currentItem.equals(correctItem)) {
// Item in wrong place
int indexOfCorrectItem = getIndexOfItemInList(mProductItems, correctItem);
Collections.swap(mProductItems, i, indexOfCorrectItem);
notifyItemMoved(i, indexOfCorrectItem);
Log.e("", "notifyItemMoved(" + i + ", " + indexOfCorrectItem+")");
Log.e("", "After:");
for(ProductWrapper wrapper : mProductItems) wrapper.log();
}
}
}
मैं भी अगर मेरे विचार तर्क बुलाया जा रहा है onBindViewHolder
को प्रवेश करने की जांच में शामिल किया है::
@Override
public void onBindViewHolder(HolderBasic holder, int position) {
Log.e("", "onBindViewHolder(holder, " + position + ")");
holder.fill(mProductItems.get(position));
}
मेरे लॉग इस तरह दिखेगा:
09-02 14:39:17.853 ﹕ Before:
09-02 14:39:17.853 : Item 0
09-02 14:39:17.853 : Item 1
09-02 14:39:17.853 : Item 2
09-02 14:39:17.853 : Item 3
09-02 14:39:17.854 ﹕ notifyItemMoved(1, 3)
09-02 14:39:17.854 ﹕ After:
09-02 14:39:17.854 : Item 0
09-02 14:39:17.854 : Item 3
09-02 14:39:17.854 : Item 2
09-02 14:39:17.854 : Item 1
09-02 14:39:17.867 ﹕ onBindViewHolder(holder, 1)
09-02 14:39:17.874 ﹕ onBindViewHolder(holder, 3)
मैं निम्नलिखित कोड फोन
जैसा कि आप देख सकते हैं, आइटम 2 को इसके प्रदर्शन को बदलने के लिए कोई कारण नहीं है - और फिर भी, यह करता है। किसी को पता है क्यों?
संपादित
मैं पूरी एडाप्टर के माध्यम से पाशन और हर आइटम पर notifyItemChanged()
फोन करके ऊपर मिल सकता है। अक्षम और अच्छा समाधान नहीं, लेकिन उपयोगकर्ता के लिए अदृश्य है।
तो, मुझे लगता है कि आप कह रहे हैं कि 'ऑनबिंडव्यूहोल्डर (धारक, 1)' नहीं कहा जाना चाहिए, है ना? मुझे यह भी नहीं पता कि यह क्यों * कहा जाता है ... लेकिन मुझे यह भी लगता है कि आपको केवल 'सूचित करें' इटैम चेंज (i); सूचित करें ItemChanged (indexOfCorrectItem); '' सूचित करने के बजाय इसे हटाएं (i, indexOfCorrectItem); 'क्या आपने कोशिश की है? –
नहीं, समस्या यह है कि आइटम 2 इसके प्रदर्शन को बदल रहा है। onBindViewHolder को 1 और 3 के लिए बुलाया जाना चाहिए क्योंकि सूचित करें IememMoved (1, 3) उनमें से दोनों को फिर से खींचा जाने की आवश्यकता है। क्या नहीं होना चाहिए आइटम 2 किसी भी तरह से शामिल होना चाहिए, इसे छुआ नहीं जाना चाहिए। – Graeme
मुझे नहीं पता कि RecyclerView सही तरीके से क्यों व्यवहार कर रहा है, लेकिन मैं * समझ सकता हूं कि यह आपके द्वारा किए जा रहे कार्यों से उलझन में है: आपने '0, 1, 2, 3]' से शुरू किया था। 'NotifyItemChanged (1, 3)' को कॉल करके आप कह रहे हैं: "मैंने आइटम स्थिति 1 को स्थिति 3 पर डाला है"। यह सच होने के लिए आपकी सूची अब '[0, 2, 3, 1]' होनी चाहिए। लेकिन यह वास्तव में '[0, 3, 2, 1] 'है, इसलिए यदि यह' ऑनबिंड व्यूहोल्डर (धारक, 1)' * निश्चित रूप से कॉल करता है * यह वहां '3' को देखने जा रहा है और '2' को ओवरराइट कर रहा है पहले वहाँ था मुझे कौन सा पहेली केवल इतना है कि इसे कॉल करने की आवश्यकता महसूस होती है ... –