24

मुझे यह समस्या है - केवल परीक्षण उद्देश्यों के लिए मैंने ParseFile को ParseObject में से एक प्राप्त सूची से जोड़ा। इसे केवल उस पंक्ति में दिखाने के बजाय यह हर 4-5 पंक्तियों को दिखाता है, कभी-कभी अधिक, कभी-कभी कम। मुझे उम्मीद है कि रीसाइक्लिंग दृश्य के साथ कुछ करने के लिए है। आश्चर्यजनक रूप से, अन्य डेटा (इस उदाहरण से हटाया गया) position चर के साथ ठीक काम करता है।पुनर्नवीनीकरण एडाप्टर और ग्लाइड - एक ही छवि प्रत्येक 4-5 पंक्तियां

@Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     if(parseList.get(position).get("logo") != null){ 
      ParseFile image = (ParseFile) parseList.get(position).get("logo"); 
      String url = image.getUrl(); 
      Glide.with(context) 
        .load(url) 
        .placeholder(R.drawable.piwo_48) 
        .transform(new CircleTransform(context)) 
        .into(holder.imageView); 


     } 

    } 

उत्तर

49

यहां दिए गए उत्तरों गलत हैं, हालांकि वे सही रास्ते पर हैं।

आपको Glide#clear() पर कॉल करने की आवश्यकता है, न कि छवि को खींचने योग्य न केवल सेट करें। यदि आप clear() पर कॉल नहीं करते हैं, तो ऑर्डर से बाहर निकलने वाला एसिंक लोड अभी भी रीसाइक्लिंग समस्याओं को देख सकता है। आपका कोड इस तरह दिखना चाहिए:

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    if (parseList.get(position).get("logo") != null) { 
     ParseFile image = (ParseFile) parseList.get(position).get("logo"); 
     String url = image.getUrl(); 
     Glide.with(context) 
       .load(url) 
       .placeholder(R.drawable.piwo_48) 
       .transform(new CircleTransform(context)) 
       .into(holder.imageView); 
    } else { 
     // make sure Glide doesn't load anything into this view until told otherwise 
     Glide.clear(holder.imageView); 
     // remove the placeholder (optional); read comments below 
     holder.imageView.setImageDrawable(null); 
    } 
} 
+0

क्या आप उस पर और विस्तार कर सकते हैं? पिछले जवाब ठीक काम कर रहे हैं, लेकिन मुझे लगता है कि 'स्पष्ट()' विधि पतली हवा से लागू नहीं की गई थी। –

+0

वे ज्यादातर काम कर रहे हैं। यदि आप BindViewHolder पर कॉल करते हैं और किसी दिए गए दृश्य के लिए लोगो के साथ स्थिति के लिए लोड शुरू करते हैं, तो लोड समाप्त होने से पहले एक ही व्यूहोल्डर के साथ फिर से बाइंडव्यूहोल्डर को कॉल करें, आपको रिक्त दृश्य की बजाय पुरानी छवि दिखाई देगी। यह दौड़ की स्थिति आपकी पिछली त्रुटि की तुलना में बहुत कम आम है, लेकिन फिर भी संभव है। –

+0

मुझे यह भी स्पष्ट करना चाहिए कि मैंने पुस्तकालय और स्पष्ट() विधि लिखा है। यहां उपयोग का मामला एक महान उदाहरण है कि क्यों स्पष्ट() विधि मौजूद है :)। आपको हमेशा एक नया लोड शुरू करना होगा (जो आपके लिए पुराना भार रद्द करता है) या जब आप दृश्यों का दोबारा उपयोग कर रहे हों तो लोड को रद्द कर दें। –

1

जब "लोगो" शून्य है, तो आप उसे साफ़ करने के बजाय पुनर्नवीनीकरण छवि मिलता है। ठीक से छवि साफ करने के लिए इस कोड जोड़ें:

holder.imageView.setImageDrawable(null); 
1

RecyclerView में प्रत्येक पंक्ति नए डेटा से पुनर्नवीनीकरण है। आपके कोड में आप ImageView केवल तभी सेट कर रहे हैं जब यह null नहीं है और अन्यथा कुछ भी नहीं कर रहा है। इस मामले में जब यह शून्य नहीं है ImageView पुरानी छवि दिखाएगा क्योंकि आपने वर्तमान ऑब्जेक्ट के लिए override नहीं किया था। आप इसे अन्य शर्त जोड़कर और ImageView को शून्य/खाली करने के लिए सेट करके इसे ठीक कर सकते हैं।

@Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     if(parseList.get(position).get("logo") != null){ 
      ParseFile image = (ParseFile) parseList.get(position).get("logo"); 
      String url = image.getUrl(); 
      Glide.with(context) 
        .load(url) 
        .placeholder(R.drawable.piwo_48) 
        .transform(new CircleTransform(context)) 
        .into(holder.imageView); 


     } 
     else{ 
      holder.imageView.setImageDrawable(null); 
     } 
    } 
+1

मैं यह जानता था, लेकिन कभी नहीं सोचा था उस तरह से। इसके लिए बहुत बहुत धन्यवाद, यह तुरंत काम किया :) –

+0

यह उत्तर अपूर्ण है। आपको प्रश्न में छवि दृश्य पर ग्लाइड.क्लर() को भी कॉल करने की आवश्यकता है, अन्यथा आप फिर भी सेल पुन: उपयोग के मुद्दों को देख सकते हैं, जब एक एसिंक लोड बाद में पूरा हो जाता है। –

+0

@ ससमजुद मैंने अभी पाया है - इसलिए मुझे 'setImageDrawable (null)' और 'Glide.clear() 'दोनों को कॉल करना चाहिए? –

2

हो सकता है कि आप इस

.signature(new StringSignature(String.valueOf(System.currentTimeMillis()))) 

नमूना की तरह कुछ प्रयास करने की आवश्यकता: है कि यह दृश्य रीसाइक्लिंग के साथ कुछ

Glide.with(context) 
       .load(url) 
       .placeholder(R.drawable.progress_animation) 
       .crossFade() 
       .signature(new StringSignature(String.valueOf(System.currentTimeMillis()))) 
       .error(R.drawable.image_error_404) 
       .into(iv); 
संबंधित मुद्दे