recyclerview glide android parse.com android-recyclerview recycler-adapter android-glide

android - glide adapter recyclerview



Recyclerview Adapter and Glide-la misma imagen cada 4-5 filas (5)

Creo que es porque su adaptador tiene adapter.setHasStableIds (true) es verdadero y getItemId no se reemplaza. Entonces recyclerView intenta encontrar el titular con la misma identificación y reutilizarlo.

Tengo este problema: solo para fines de prueba agregué ParseFile a uno de ParseObject de la lista recibida. En lugar de mostrarlo solo en esa fila, muestra cada 4-5 filas, a veces más, a veces menos. Supongo que la vista de reciclaje tiene algo que ver con esto. Extrañamente, otros datos (eliminados de este ejemplo) funcionan bien con la variable de position .

@Override public void onBindViewHolder(ViewHolder holder, int position) { if(parseList.get(position).get("logo") != null){ ParseFile image = (ParseFile) parseList.get(position).get("logo"); String url = image.getUrl(); Glide.with(context) .load(url) .placeholder(R.drawable.piwo_48) .transform(new CircleTransform(context)) .into(holder.imageView); } }


Cuando "logo" es nulo, obtienes la imagen reciclada en lugar de borrarla. Agregue este código para borrar la imagen correctamente:

holder.imageView.setImageDrawable(null);


En RecyclerView cada fila se recicla con nuevos datos. En su código, configura ImageView solo cuando no es null y no hace nada. En este caso, cuando no sea nulo, ImageView mostrará la imagen anterior ya que no override el objeto actual. Puede solucionar esto agregando la condición else y configurando ImageView para null / blank cualquier cosa.

@Override public void onBindViewHolder(ViewHolder holder, int position) { if(parseList.get(position).get("logo") != null){ ParseFile image = (ParseFile) parseList.get(position).get("logo"); String url = image.getUrl(); Glide.with(context) .load(url) .placeholder(R.drawable.piwo_48) .transform(new CircleTransform(context)) .into(holder.imageView); } else{ holder.imageView.setImageDrawable(null); } }


Las respuestas aquí son incorrectas, aunque están en el camino correcto.

Glide#clear() llamar a Glide#clear() , no solo establecer el drawable de la imagen como nulo. Si no llama a clear() , una carga asíncrona que se completa fuera de servicio puede causar problemas de visualización de reciclaje. Tu código debería verse así:

@Override public void onBindViewHolder(ViewHolder holder, int position) { if (parseList.get(position).get("logo") != null) { ParseFile image = (ParseFile) parseList.get(position).get("logo"); String url = image.getUrl(); Glide.with(context) .load(url) .placeholder(R.drawable.piwo_48) .transform(new CircleTransform(context)) .into(holder.imageView); } else { // make sure Glide doesn''t load anything into this view until told otherwise Glide.clear(holder.imageView); // remove the placeholder (optional); read comments below holder.imageView.setImageDrawable(null); } }


Quizás necesites probar algo como esto

.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))

muestra:

Glide.with(context) .load(url) .placeholder(R.drawable.progress_animation) .crossFade() .signature(new StringSignature(String.valueOf(System.currentTimeMillis()))) .error(R.drawable.image_error_404) .into(iv);