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-
- Cómo obligar a RecyclerView a desplazarse cuando no hay suficientes elementos para llenar la altura de la sceen
- Cómo obtener clics en RecyclerView (NO los niños)
- SetAlpha () en onBindView en RecyclerView no funciona en la primera pantalla
- Comportamiento extraño de RecyclerView después de eliminar el elemento
- Cómo agregar Android Support v7 bibliotecas en eclipse?
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.
- RecyclerView dentro de ScrollView / NestedScrollView no se desplaza correctamente
- onclicklistener en el elemento específico de la recyclerview en android
- Disposición de Android: Recyclerview horizontal dentro de una Recyclerview vertical dentro de un Viewpager con comportamientos de desplazamiento
- NativeAdsExpress obliga a RecyclerView a desplazarse para que el NativeAd se vea completamente cuando se carga por primera vez
- RecyclerView onItemClick Listener
- Android RecyclerView: Cambiar archivo de diseño LIST a GRID onOptionItemSelected
- ¿Recyclerview hace que el último elemento agregado sea el elemento seleccionado?
- GridLayoutManager - el ancho de la columna envuelve a su propio hijo mayor
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);
- Android Handler para la tarea repetida – se superpone? Temporizador-tarea VS manejador VS alarma-administrador
- Envío de varios archivos a través de Bluetooth