android imageview android-recyclerview

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:

verdad

No es cierto

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í ...