android - RecyclerView muestra una imagen incorrecta después del desplazamiento rápido
imageview android-recyclerview (1)
Hola, creo que tu problema está aquí:
if (!dItem.getIconUrl().isEmpty()){
holder.imgLoader.DisplayImage(dItem.getIconUrl(), holder.imgCafe); //load image from cache or web
}
else{
holder.imgCafe.setImageResource(R.drawable.icon200); //set default image
}
Puedo ofrecerte dos soluciones que pueden funcionar. Primero compruebe que su imagenUrl es nula con TextUtils.isEmpty()
if (!TextUtils.isEmpty(dItem.getIconUrl())){
holder.imgLoader.DisplayImage(dItem.getIconUrl(), holder.imgCafe);
}
else{
holder.imgCafe.setImageResource(R.drawable.icon200); //set default image
}
Si esto no funciona, si puede configurar una imagen dibujable para la empty url
o si la url loading fail
déjela en el descargador de imágenes y simplemente use el siguiente código:
holder.imgLoader.DisplayImage(dItem.getIconUrl(), holder.imgCafe);
En mi aplicación, estoy usando RecyclerView.Adapter
con mi clase Holder
personalizada. Cada elemento consiste en pocos TextView
y un ImageView
(icono). El problema es que RecyclerView
muestra una imagen incorrecta después del desplazamiento rápido.
Ejemplo:
Entonces, mi titular es:
public class CafeHolder extends RecyclerView.ViewHolder implements OnClickListener {
TextView itemName, itemType, itemMarksCount, itemCommentsCount, itemRating;
ImageView imgCafe;
ImageLoader imgLoader;
private Context context;
private int cafeId;
public CafeHolder(View view, Context context){
super(view);
this.context = context;
itemName = (TextView) view.findViewById(R.id.tvCafeName);
imgCafe = (ImageView) view.findViewById(R.id.imgCafe);
itemType = (TextView) view.findViewById(R.id.tvCafeType);
itemMarksCount = (TextView) view.findViewById(R.id.tvMarksCount);
itemCommentsCount = (TextView) view.findViewById(R.id.tvCommentsCount);
itemRating = (TextView) view.findViewById(R.id.tvRatingCount);
imgLoader = new ImageLoader(context);
view.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent = new Intent(context, InfoActivity.class);
intent.putExtra(CafeDomain.ID, cafeId);
context.startActivity(intent);
}
public void setCafeId(int cafeId){
this.cafeId = cafeId;
}
Y mi RecyclerView.Adapter:
public class CafeAdapter extends RecyclerView.Adapter<CafeHolder> {
private Context context;
List<CafeDomain> listItems;
public CafeAdapter(List<CafeDomain> listItems, Context context) {
this.listItems = listItems;
this.context = context;
}
@Override
public CafeHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_cafe_item2, parent, false);
CafeHolder vh = new CafeHolder(v, context);
return vh;
}
@Override
public void onBindViewHolder(CafeHolder holder, int position) {
CafeDomain dItem = this.listItems.get(position);
holder.imgCafe.setImageDrawable(null);
holder.itemName.setText(dItem.getName());
ArrayList<TypeDomain> types = dItem.getTypes();
StringBuilder sbTypes = new StringBuilder();
for (int i = 0; i < types.size(); i++){
sbTypes.append(types.get(i).getName());
if (i!=types.size()-1)
sbTypes.append(", ");
}
holder.itemType.setText(sbTypes.toString());
if (!dItem.getIconUrl().isEmpty()){
holder.imgLoader.DisplayImage(dItem.getIconUrl(), holder.imgCafe); //load image from cache or web
}
else{
holder.imgCafe.setImageResource(R.drawable.icon200); //set default image
}
holder.itemMarksCount.setText(String.valueOf(dItem.getMarksCount()));
holder.itemCommentsCount.setText(String.valueOf(dItem.getCommentsCount()));
holder.itemRating.setText(String.valueOf(dItem.getRating()));
holder.setCafeId(listItems.get(position).getId());
}
@Override
public int getItemCount() {
return listItems.size();
}
}
Puedo ver que este código:
else{
holder.imgCafe.setImageResource(R.drawable.icon200); //set default image
}
está funcionando, pero dos imágenes están mal de todos modos :(
ACTUALIZACIÓN: el problema es solo cuando se realiza un desplazamiento rápida de la lista sin memoria caché de imagen en el disco. Cuando tenemos caché, no hay problema aquí ...