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 шт):

Автор решения: Tony

Попробуйте использовать вместо переменной 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);
}
→ Ссылка
Автор решения: Sergei Buvaka

Проблема ваша в том, что вот в этом куске кода:

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 они не попали.

Надеюсь понятно обяснил?

→ Ссылка