Recycliewiew Adapter и Glide - одинаковое изображение каждые 4-5 строк
У меня есть эта проблема - только для целей тестирования я добавил ParseFile
в один из ParseObject
из полученного списка. Вместо того, чтобы показывать его только в этой строке, он показывает каждые 4-5 строк, иногда больше, а иногда и меньше. Я полагаю, что обращение к переработке имеет какое-то отношение к этому. Как ни странно, другие данные (удаленные из этого примера) отлично работают с переменной 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);
}
}
Ответы
Ответ 1
Ответы здесь неверны, хотя они на правильном пути.
Вам нужно вызвать Glide#clear()
, а не просто установить изображение для рисования на ноль. Если вы не позвоните 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 does not load anything into this view until told otherwise
Glide.clear(holder.imageView);
// remove the placeholder (optional); read comments below
holder.imageView.setImageDrawable(null);
}
}
Ответ 2
Возможно, вам нужно попробовать что-то вроде этого
.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);
Ответ 3
Когда "логотип" равен нулю, вы получаете переработанное изображение, а не очищаете его. Добавьте этот код, чтобы правильно очистить изображение:
holder.imageView.setImageDrawable(null);
Ответ 4
В RecyclerView
каждая строка перерабатывается с новыми данными. В вашем коде вы устанавливаете ImageView
только тогда, когда он не null
и в противном случае ничего не делает. В этом случае, когда он не имеет значения null ImageView
, будет отображаться старое изображение, так как для текущего объекта не было override
. Вы можете исправить это, добавив условие else и установив ImageView
в значение null/blank.
@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);
}
}
Ответ 5
Я думаю, это потому, что у вашего адаптера есть adapter.setHasStableIds(true) и trueItemId не переопределяется. Поэтому recyclerView пытается найти владельца с таким же идентификатором и использовать его повторно.