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

Ответ здесь неверен, хотя они на правильном пути.

Вам нужно вызвать 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 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); } } 

Когда «логотип» имеет значение NULL, вы получаете обратное изображение, а не очищаете его. Добавьте этот код, чтобы правильно очистить изображение:

 holder.imageView.setImageDrawable(null); 

В RecyclerView каждая строка перерабатывается с новыми данными. В коде вы устанавливаете ImageView только тогда, когда он не является 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); } } 

Может быть, вам нужно попробовать что-то вроде этого

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