2016-03-30 5 views
10

मैं as seen in this tutorial के अंदर विषम दृश्यों के साथ RecyclerView का उपयोग कर रहा हूं।मैं चाहता हूं कि मेरा रीसाइक्लर कुछ आइटम रीसायकल न करें

मेरे पास कुछ रीसाइक्लिंग व्यू के अंदर कुछ आइटम हैं जो रीसाइक्लिंग व्यू हैं। कल्पना करने के लिए बहुत मुश्किल है? मान लीजिए कि मैं Play Store के लेआउट की प्रतिलिपि बनाना चाहता हूं: लंबवत रैखिक लेआउट के साथ एक बड़ा पुनर्चक्रण दृश्य और कई तत्वों से भरा: एकल ऐप्स और ऐप्स का कैरोसेल।

यदि आइटम जोड़ने के लिए एक ऐप के लिए लेआउट है तो आईडी 1 का उपयोग किया जाएगा और मैं एक आइटम के लिए लेआउट जोड़ूंगा। अन्यथा, अगर मुझे कैरोसेल जोड़ने की ज़रूरत है तो मैं मुख्य पुनर्चक्रण दृश्य में एक तत्व जोड़ूंगा: एक अन्य पुनर्चक्रण अपने स्वयं के एडाप्टर के साथ देखें।

यह बहुत अच्छी तरह से काम करता है। सिवाय जब आप मुख्य RecyclerView स्क्रॉल करते हैं। क्यूं कर? क्योंकि onBindViewHolder() विधि में और दृश्यमान नहीं होने पर कुछ विचार नष्ट हो रहे हैं। यहाँ क्यों? चूंकि मुख्य RecyclerView का एडाप्टर स्थिति X के लिए गुजर रहा है और फिर OnBindViewHolder() पर कॉल करता है। उत्तरार्द्ध तब अपने नए एडाप्टर के साथ एक नया पुनर्चक्रण दृश्य बनाता है और इसे सौंपता है। मैं उन विचारों को सिर्फ इसलिए रखना चाहता हूं क्योंकि वे हर बार फिर से भरने के लिए भारी होते हैं।

क्या यह संभव है? यदि हां, तो क्या आप मुझे बता सकते हैं कि कैसे?

उत्तर

33

उपयोग करें:

recyclerView.getRecycledViewPool().setMaxRecycledViews(TYPE_CAROUSEL, 0); 

यह viewType TYPE_CAROUSEL के किसी भी दृश्य पुनरावृत्ति नहीं होगी, लेकिन अगर इस प्रकार के आइटम गिनती बहुत अधिक है, तो यह अपने प्रदर्शन में काफी कम हो जाएगा, हो सकता है यहां तक ​​कि OOMEs

कारण

संपादित

MML13 के जवाब पढ़ने के बाद, मैं इसे आप के लिए काम कर सकते हैं लगता है। जब आप बाहरी रीसाइक्लिंग व्यू में उस दृश्य को पुनर्निर्मित करते हैं तो आप अपने कैरोसेल की चीजों को फिर से भरने के बारे में चिंतित हैं। यदि वे सभी कैरोसेल एक ही प्रकार के हैं, यानी, वे सभी एक ही एडाप्टर का उपयोग करते हैं, तो आप एडाप्टर को बाहरी रीसाइक्लर व्यू के व्यूहोल्डर के अंदर रख सकते हैं, और डेटा को स्वैप कर सकते हैं और notifyDataSetChanged() या notifyItemRangeChanged(...) को इस एडाप्टर पर पुनर्निर्मित करते समय कॉल कर सकते हैं। यह सभी कैरोसेल दृश्यों और उन कैरोसेल के अंदर सभी विचारों को रीसायकल करेगा।

+0

यह मेरे लिए अच्छा काम करता है! –

+0

'int viewType' पैरामीटर के लिए पास होने वाला डिफ़ॉल्ट मान क्या है ?? मुझे इसके लिए कोई दस्तावेज नहीं मिला? – Sanoop

+2

@ सानोप जब तक आप 'getItemViewType' को ओवरराइड नहीं करते हैं, तो डिफ़ॉल्ट दृश्य टाइप '0' है (देखें [यह] (https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v7/recyclerview /src/android/support/v7/widget/RecyclerView.java#5818)) – Sourabh

7

क्योंकि कुछ दृश्य तब नष्ट हो रहे हैं जब कोई और दिखाई नहीं दे रहा है और फिर ऑनबिंडव्यूहोल्डर() विधि में पुनर्निर्मित किया गया है।

यह सच नहीं है, वे फिर से नहीं बनाए गए हैं, वे सिर्फ rebind। यदि आपके पास स्थिति एक्स (स्क्रैप या रीसाइक्लर में) RecyclerView का उपयोग करने के लिए इसका उपयोग किया जा रहा है और इसे पुन: चालू करें।

मैं उन विचारों को सिर्फ इसलिए रखना चाहता हूं क्योंकि वे हर बार फिर से भरने के लिए भारी हैं।

मुख्य RecyclerView उन लोगों को आपके लिए रखता है। आपको केवल अपने दूसरे RecyclerView के एडाप्टर डेटा को बदलने की आवश्यकता है और notifyDataSetChanged पर कॉल करें। अपने मुख्य RecyclerView के viewHolder के अंदर अपना दूसरा RecyclerView एडाप्टर भी स्टोर करें।

+1

मेरा दिन +1 सहेजें। – Bawa

3

आप एडाप्टर के अपने ऑनबिंडवॉल्डर() विधि में कोड नीचे भी सेट कर सकते हैं।

holder.setIsRecyclable(false); 

मैं अपनी गतिविधि में नीचे रेखा सेट इस लिंक

http://aphoe.com/blog/prevent-androids-recyclerview-recycling-views/

+0

बहुत अच्छा !!! धन्यवाद – susemi99

0

से संदर्भ ले लिया है

recyclerView.getRecycledViewPool().setMaxRecycledViews(1,0);

RecyclerViewAdapter कक्षा में नीचे दिए गए कोड सेट

@Override 
    public int getItemViewType(int position) { 
     return 1; 
    } 
संबंधित मुद्दे