Обновить Adapter

Есть адаптер для RecyclerView. При нажатии элемент, открывается второе активити, при чем первое не закрывается (Нету finish()). Как только пользователь наигрался во второе активити, он нажимает назад, и попадает снова на RecyclerView. После этого на том элементе, на который нажимал пользователь должны появиться галочка

введите сюда описание изображения

Галочку я добавляю в методе onBindViewHolder (в реализации адаптера). В таком случае галочка появляется только тогда, когда пользователь отматает далеко и вернется обратно (система забывает и отрисовывает вновь данный элемент). Как сделать так, чтобы при возвращении со второго активити галочка сразу же появилась без нужды в проматывании и возвращении?

Я придумал КОЛХОЗНОЕ решение которое мне не подходит. В методе onResume() класса, в котором лежит адаптер, поставил принудительную очистку и перезаполнение адаптера, что заставляет систему перерисовать и галочка появляется. Я полагаю, что это решается каким то методом, но не знаю каким. Спасибо


Ответы (1 шт):

Автор решения: Sergei Buvaka

Создаете объект вроде такого:

class ListItem {

    private boolean isChecked;
    private YourRecyclerObject data;

    // setters and getters
}

Создаете список этих объектов где-то за пределами вашего адаптера (Presenter/ViewModel и т.п. сущности). Передаете этот список в ваше адаптер и в зависимости от поля isChecked проставляете галку.

При нажатии на элемент меняете значение этого параметра в вашем Presenter/ViewModel в списке и снова вызываете обновление адаптера с новым параметром. Можно вызывать и в другом месте если у вас галка должна появиться не сразу после клика, но суть все равно такая же должна быть. Так ваш адаптер будет тупой и не зависеть от внешних факторов, а настройки элементов вы сможете контролировать извне.

Чтоб не обновлять всякий раз весь список вместо вызова notifyDataSetChanged() вызывайте или notifyItemChanged(position). Или еще лучше используйте DiffUtils

→ Ссылка