Recyclerview адаптер и Glide - же изображение каждые 4-5 рядов
у меня эта проблема - только для целей тестирования я добавил ParseFile в одном из ParseObject из полученного списка. Вместо того, чтобы показывать его только в этой строке он показывает каждые 4-5 строк, иногда больше, иногда меньше. Я supspect, что вид утилизации надо что-то делать с этим. Как ни странно, другие данные (удаленные из этого примера) отлично работают с 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);
}
}
5 ответов
ответы здесь неверны, хотя они находятся на правильном пути.
нужно позвонить Glide#clear(), а не просто установить изображение drawable в null. Если вы не позвоните clear(), асинхронная загрузка, завершающая из строя, все еще может вызвать проблемы с переработкой представления. Ваш код должен выглядеть так:
@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);
}
}
Возможно, вам нужно попробовать что-то вроде этого
.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
пример :
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);
когда "логотип" равен null, вы получаете переработанное изображение вместо его очистки. Добавьте этот код, чтобы правильно очистить изображение:
holder.imageView.setImageDrawable(null);
на RecyclerView каждая строка перерабатывается с новыми данными. В вашем коде вы устанавливаете ImageView только когда это не null и больше ничего не делать. В этом случае, когда это не null ImageView покажет старое изображение, так как вы не override для текущего объекта. Вы можете исправить это, добавив условие else и установив ImageView для null / пустого ничего.
@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);
}
}
Я думаю, это потому, что ваш адаптер имеет адаптер.setHasStableIds (true) является true и getItemId не переопределяет. Поэтому recyclerView пытается найти держатель с тем же идентификатором и повторно использовать его.