आप अपने अनुकूलक में स्थिर आईडी है, तो आप बहुत अच्छे परिणाम (एनिमेशन) प्राप्त कर सकते हैं अगर आप फ़िल्टर किए गए आइटम वाले एक नई सरणी बना सकते हैं और फोन
recyclerView.swapAdapter(newAdapter, false);
swapAdapter संकेत का उपयोग करना है कि यह कर सकते हैं RecyclerView दृश्य धारकों का पुनः उपयोग करें। (सेट एडाप्टर में बनाम, इसे सभी विचारों को रीसायकल करना और फिर से बनाना है क्योंकि यह नहीं पता कि नए एडाप्टर में पुराने एडाप्टर के साथ एक ही व्यूहोल्डर सेट है)।
एक बेहतर तरीका यह पता लगाएगा कि कौन से आइटम हटा दिए गए हैं और notifyItemRemoved(index)
पर कॉल कर रहे हैं। वास्तव में आइटम को हटाने के लिए मत भूलना। यह RecyclerView पूर्वानुमानित एनिमेशन चलाएगा। मान लें कि आप एक एडाप्टर है कि आंतरिक रूप से एक ArrayList का उपयोग करता है, कार्यान्वयन इस प्रकार दिखाई देगा:
// adapter code
final List<ItemData> mItems = new ArrayList(); //contains your items
public void filterOut(String filter) {
final int size = mItems.size();
for(int i = size - 1; i>= 0; i--) {
if (mItems.get(i).test(filter) == false) {
mItems.remove(i);
notifyItemRemoved(i);
}
}
}
यह प्रदर्शन करेंगे, भले ही आप बैच notifyItemRemoved
कॉल कर सकते हैं और इसके बजाय notifyItemRangeRemoved
का उपयोग बेहतर है। यह sth दिखाई देगा: (परीक्षण नहीं)
public void filterOut(String filter) {
final int size = mItems.size();
int batchCount = 0; // continuous # of items that are being removed
for(int i = size - 1; i>= 0; i--) {
if (mItems.get(i).test(filter) == false) {
mItems.remove(i);
batchCount ++;
} else if (batchCount != 0) { // dispatch batch
notifyItemRangeRemoved(i + 1, batchCount);
batchCount = 0;
}
}
// notify for remaining
if (batchCount != 0) { // dispatch remaining
notifyItemRangeRemoved(0, batchCount);
}
}
आप आइटम है कि पहले बाहर फ़िल्टर किया गया जोड़ने के लिए इस कोड का विस्तार करने की जरूरत है, लेकिन अब दिखाई देना चाहिए (जैसे उपयोगकर्ता फ़िल्टर क्वेरी से हटा देता है) लेकिन मुझे लगता है कि यह एक ऐसा करना चाहिए मूल विचार दें।
ध्यान रखें कि, प्रत्येक सूचित आइटम कॉल इसके बाद प्रभावित करता है (यही कारण है कि मैं इसे से बचने के लिए सूची से आगे बढ़ रहा हूं)। अंत से ट्रैवर्सिंग भी ऐरेलिस्ट के हटाने विधि प्रदर्शन (शिफ्ट करने के लिए कम आइटम) में मदद करता है।
उदाहरण के लिए, यदि आप शुरुआत से सूची को घुमा रहे थे और पहले दो आइटम हटा दिए थे। आप या तो
notifyItemRangeRemoved(0, 2); // 2 items starting from index 0
या अगर आप उन्हें एक
notifyItemRemoved(0);
notifyItemRemoved(0);//because after the previous one is removed, this item is at position 0
आप आप सिर्फ इसका एक नया 'ItemsAdapter' बना सकते हैं एक और सरणी देना चाहता हूँ और फिर setAdapter' फोन' है। –