RecyclerView показывает картинку из предыдущего item
Имеется RecyclerView, в адаптере которого в числе прочего ImageView. При наличии ссылки в листе должен показывать изображение, а в отсутствие - скрыть,соответственно.
//картинка,если есть
holder.attachment.setVisibility(!comments.get(position).hasAttachment() ? View.GONE:View.VISIBLE);//если нет - прячем
if (holder.attachment.getVisibility()==View.VISIBLE){
GetImage task = new GetImage(holder.attachment);
task.execute(comments.get(position).attachment);
}
В классе comments:
public boolean hasAttachment(){
return this.attachment != null && !this.attachment.equals("");
}
Если в первых элементах ссылок нет,а в последнем есть - все как положено. Но, если после элемента с загруженным изображением идет пустой, адаптер показывает изображение с предыдущего item'а. Как заставить его убирать картинки с пустой ссылкой?
UPD:
Решил проблему так: в блоке if(!comments.get(position).hasAttachment()) указал весь метод bindViewHolder без ImageView. При этом удалил его из разметки. А в блоке else написал тоже самое, но с программным добавлением ImageView в LinearLayout. Спасибо всем за помощь!
Ответы (2 шт):
Попробуйте использовать вместо переменной position - переменную holder.getAdapterPosition()
Должно сработать
Следующее чтобы я сделал, то это отрефакторил бы ваш код:
if(!comments.get(holder.getAdapterPosition()).hasAttachment(){
holder.attachment.setVisibility = View.GONE
}else{
holder.attachment.setVisibility = View.VISIBLE
GetImage task = new GetImage(holder.attachment);
task.execute(comments.get(holder.getAdapterPosition()).attachment);
}
Проблема ваша в том, что вот в этом куске кода:
holder.attachment.setVisibility(!comments.get(position).hasAttachment() ? View.GONE:View.VISIBLE);//если нет - прячем
if (holder.attachment.getVisibility()==View.VISIBLE){
GetImage task = new GetImage(holder.attachment);
task.execute(comments.get(position).attachment);
}
Вы биндите через if. Но RecyclerView реализует паттерн ViewHolder и значит переиспользует View. Поэтому есть правило: "Если вы пишете в вашем bindViewHolder() какой-либо if то ВСЕГДА должен быть else. Иначе вы будете получать View со старыми значениями которые задавались в if-e, но не забиндились заново т.к. нет else, а в if они не попали.
Надеюсь понятно обяснил?