24

Bu sorunu yaşıyorum - sadece test amaçlı ParseFile'u alınan listeden ParseObject'a ekledim. Sadece o satırda göstermek yerine, bazen daha fazla, bazen daha az, her 4-5 satır gösterir. Geri dönüşüm görünümünün bununla bir ilgisi olduğunu düşünüyorum. Gariptir, diğer veriler (bu örnekten silindi) position değişkeniyle iyi çalışır.Recyclerview Adaptör ve Glide - her 4-5 satırda aynı görüntü

cevap

49

Buradaki yanıtlar yanlış, ancak doğru yoldalar.

Glide#clear() numaralı telefonu aramanız yeterlidir, sadece görüntüyü null olarak çizilemez. clear() numaralı telefonu aramazsanız, siparişin tamamlanmadığı bir uyumsuz yükleme yine de görünüm geri dönüşüm sorunlarına neden olabilir.

@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

Bunun hakkında daha fazla bilgi verebilir misiniz? Önceki cevaplar iyi çalışıyor, ama sanırım 'clear()' yöntemi sadece ince havadan uygulanmadı. –

+0

Sadece çoğunlukla çalışıyorlar. OnBindViewHolder öğesini çağırır ve belirli bir görünüm için logolu bir konum için bir yük başlatırsanız, yük bitmeden aynı ViewHolder ile tekrar onBindViewHolder öğesini çağırın, boş görüntü yerine eski resmi görürsünüz. Bu yarış durumu önceki hatadan çok daha az yaygın, ancak yine de mümkün. –

+0

Ayrıca açıklamalıyım ben kütüphane ve clear() yöntemini yazdım. Buradaki kullanım durumu, clear() yönteminin neden var olduğuna dair harika bir örnektir :). Her zaman yeni bir yükleme başlatmanız (eski yükü sizin için iptal eder) veya yeniden görüntülediğinizde yükü kendiniz iptal etmeniz gerekir. –

1

"Logo" null olduğunda, temizlemek yerine geri dönüştürülmüş görüntü elde edersiniz. Düzgün görüntü temizlemek için bu kodu ekleyin: RecyclerView yılında her satır yeni verilerle geri dönüştürülmektedir

holder.imageView.setImageDrawable(null); 
1

. Kodunuzda ImageView ayarını yalnızca null değilken ve hiçbir şey yapmadan ayarlıyorsunuz. Bu durumda, ImageView boş değilken, geçerli nesne için override'u kullanmadığınızdan eski resim gösterilecektir. Bunu başka bir koşul ekleyerek ve herhangi bir şeyi boş/boş bırakmak için ImageView ayarlayarak düzeltebilirsiniz.

@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

Biliyordum ama hiç düşünmemiştim bu şekilde. Bunun için çok teşekkürler, hemen çalıştı :) –

+0

Bu cevap eksik. Ayrıca, söz konusu resim görünümünde Glide.clear() öğesini çağırmanız gerekir; aksi halde, bir async yükünün daha sonra tamamlanmasından sonra hücre yeniden kullanım sorunlarını görmeye devam edebilirsiniz. –

+0

@samajudd Sadece bir tane buldum - bu yüzden hem setImageDrawable (null) hem de Glide.clear() 'yi çağırmalıyım? –

2

Belki bu

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

numunenin gibi bir şey denemek gerekir: Kodunuz gibi görünmelidir bu görünüm geri dönüşümü ile bir şey olduğunu

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); 
İlgili konular