Ich implementiere eine Liste mit Recyclerview und Glide, um die Bilder asynchron zu laden. Was passiert ist, dass jedes Mal, wenn eine Karte recycelt wird, bevor das Bild vollständig geladen ist, die Glide-Bild-Antwort zu einer anderen Kartenansicht geht. Als Ergebnis sehen wir Bilder auf der Liste irgendwie duplizieren. Ich habe viele Ansätze ausprobiert, aber ich bin immer noch mit diesem Problem. Ich danke wirklich jeder Antwort, um mir zu helfen, es zu lösen.Recyclerview Duplizieren von Bildern mit Glide
Das ist mein vereinfachten Code:
public class RVAdapter extends RecyclerView.Adapter<RVAdapter.ZueiraViewHolder> {
public static ArrayList<Zueira> zueiras;
public Context context;
private static final int IMAGE_WIDTH = 400;
private static final int IMAGE_HEIGHT = 600;
public RVAdapter(ArrayList<Zueira> zueiras, Context context) {
this.zueiras = zueiras;
this.context = context;
}
@Override
public void onBindViewHolder(ZueiraViewHolder holder, int position) {
// set description
holder.zueira_description.setText(zueiras.get(position).getDescription());
// THIS THING IS ASYNC!
// I think when I scroll too fast, since it's async, the response may be
// coming late because that card was already recycled
Glide.with(context)
.load(zueiras.get(position).getUrl())
.asBitmap()
.into(new SimpleTarget<Bitmap>(IMAGE_WIDTH, IMAGE_HEIGHT) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
// set image bitmap
holder.zueira_image.setImageBitmap(resource);
// some click listener
holder.zueira_image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// some logic goes here after the image is completely loaded
}
});
}
@Override
public void onLoadFailed(Exception e, Drawable errorDrawable) {
super.onLoadFailed(e, errorDrawable);
}
});
}
@Override
public ZueiraViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.custom_row, viewGroup, false);
ZueiraViewHolder pvh = new ZueiraViewHolder(v);
return pvh;
}
@Override
public int getItemCount() {
return zueiras.size();
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
public static class ZueiraViewHolder extends RecyclerView.ViewHolder {
CardView cv;
public ImageView zueira_image;
public TextView zueira_description;
ZueiraViewHolder(View itemView) {
super(itemView);
cv = (CardView) itemView.findViewById(R.id.cv);
zueira_image = (ImageView) itemView.findViewById(R.id.zueira_image);
zueira_description = (TextView) itemView.findViewById(R.id.zueira_description);
}
}
}
Dank.
Dank. Ich habe diese zwei Zeilen hinzugefügt, aber Bilder werden immer noch dupliziert –