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
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);
}
}
"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);
. 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);
}
}
Biliyordum ama hiç düşünmemiştim bu şekilde. Bunun için çok teşekkürler, hemen çalıştı :) –
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. –
@samajudd Sadece bir tane buldum - bu yüzden hem setImageDrawable (null) hem de Glide.clear() 'yi çağırmalıyım? –
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);
Bunun hakkında daha fazla bilgi verebilir misiniz? Önceki cevaplar iyi çalışıyor, ama sanırım 'clear()' yöntemi sadece ince havadan uygulanmadı. –
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. –
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. –