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);