Picasso problema de extracción de imágenes cuando se utiliza con RecyclerView

En mi aplicación, estoy mostrando los artículos que se obtienen de un servicio web. Estos artículos tienen título, imagen y otros campos. Para mostrar las imágenes, estoy usando Picasso .

Problema – Mientras recorre el RecyclerView, veo que las imágenes se pierden. Algunos elementos tienen las imágenes duplicadas. Sé que es RecyclerView que reutiliza el diseño del elemento xml y debido a que está creando un problema. Pero creo que debe haber alguna solución a este problema. He buscado en Google esto y he encontrado algunos posts en stackoverflow pero eso no me ayudó. Por ejemplo-

Picasso carga imágenes con una imagen errónea en un adaptador de lista

He intentado el siguiente pero teniendo el mismo problema-

public class ArticleAdapter extends RecyclerView.Adapter<ArticleAdapter.ArticleViewHolder> { protected Activity mActivity; protected List<Article> mItems = new ArrayList<>(); private static OnEntityClickCallback mCallback; public ArticleAdapter(Activity pActivity) { mActivity = pActivity; } public void setItemClickCallback(OnEntityClickCallback pCallback) { this.mCallback = pCallback; } @Override public ArticleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View articleView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_article_item, parent, false); return new ArticleViewHolder(articleView); } public void addItem(List<Article> moreItems) { mItems.addAll(moreItems); notifyDataSetChanged(); } public void removeItems(){ mItems.clear(); notifyDataSetChanged(); } @Override public void onBindViewHolder(ArticleViewHolder holder, int position) { holder.bind(mItems.get(position)); } @Override public int getItemCount() { return mItems.size(); } static class ArticleViewHolder extends RecyclerView.ViewHolder { private TextView tvTitle; TextView tvAuthor; TextView tvPostdate; ImageView imgImage; RatingBar ratingBar; public ArticleViewHolder(View view) { super(view); this.tvTitle = (TextView) view.findViewById(R.id.tv_title); this.tvAuthor = (TextView) view.findViewById(R.id.tv_author); this.tvPostdate = (TextView) view.findViewById(R.id.tv_date); this.imgImage = (ImageView) view.findViewById(R.id.img_image); this.ratingBar = (RatingBar) view.findViewById(R.id.ratingBar); } public void bind(final Article article) { tvTitle.setText(article.getTitle()); tvPostdate.setText(article.getPostdate()); tvAuthor.setText(article.getAuthor()); // Canceling the older request Picasso.with(imgImage.getContext()).cancelRequest(imgImage); // Creating a new request. if (article.getImage() != null) { Picasso.with(imgImage.getContext()).load(article.getImageUrl()) .placeholder(R.drawable.noimage) .error(R.drawable.noimage) .into(imgImage); } this.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mCallback != null) mCallback.onEntitySelected(article); } }); } } } 

Actualizar – Parte de mi archivo de diseño

  <ImageView android:id="@+id/img_image" android:layout_width="match_parent" android:layout_height="@dimen/cardview_image_thumbnail_height" android:layout_alignParentStart="true" android:layout_alignParentLeft="true" android:scaleType="centerCrop" android:layout_margin="@dimen/cardview_padding_btw_widgets" android:src="@drawable/noimage" /> 

Cualquier ayuda sería apreciada. Gracias.

Externamente establecer el dibujable, ya que está recibiendo la imagen que tiene algunos dibujables ya se adjunta a la misma. La vista de imagen no se vuelve a crear, por lo que la imagen anterior en el ImageView estará visible hasta que la quite.

  if (article.getImage() != null) { Picasso.with(imgImage.getContext()).load(article.getImageUrl()) .placeholder(R.drawable.noimage) .error(R.drawable.noimage) .into(imgImage); }else{ // imgImage.setImageDrawable(null); imgImage.setImageDrawable(R.drawable.some_drawable); } 

Utilice setTag en onBindViewHolder que almacenará datos y sus imágenes no se perderán.

 @Override public void onBindViewHolder(ArticleViewHolder holder, int position) { holder.bind(mItems.get(position)); holder.imgImage.setTag(mItems.get(position)); } 

O

Tal vez pruebe su enfoque tal vez funciona

 @Override public void onBindViewHolder(ArticleViewHolder holder, int position) { holder.bind.setTag(mItems.get(position)); } 

Tu vista se reutiliza.

Llame a Picasso.with(imgImage.getContext()).cancelRequest(imgImage); Para cancelar cualquier solicitud existente de ImageView.

A continuación, puede cargar su imagen si article.getImage() != null y proporcionar una alternativa si su imagen del artículo es nulo como imgImage.setImageDrawable(R.drawable.some_drawable);

  • Cómo puedo crear un diseño nestedScroll como este?
  • FindFirstVisibleItemPositions no funciona para recycleview android
  • RecyclerView con GridLayoutManager intentando resolver wrap_content
  • ConstraintLayout forma de contenido cambiado si se desplaza
  • La creación de clase Pojo desde el cursor Sqlite está tomando demasiado tiempo
  • RecyclerView item layout_weight, tamaños no actualizados
  • CollapsingToolbarLayout no debe colapsar cuando RecyclerView está vacío
  • Facebook Anuncios nativos en RycyclerView android
  • Aumenta la escala del elemento en RecyclerView para superponer 2 elementos adyacentes.
  • ¿Qué es alertcontroller.recyclelistview
  • ¿Cómo desplazar horizontalmente RecyclerView de forma programática?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.