Вечно забываю про такую отличную вещь, как DiffUtil.

Накидаю простейший Recycler с адаптером и списком поэтов.

Теперь пора заняться MainActivity:

Можно запустить — всё будет работать.Но! Добавлю обработчик кнопки:

Теперь при нажатии на кнопку Update лист изменится. При этом будут перерисованы все элементы списка. В этом легко убедиться, если внедрить логгер в метод bind() адаптера. А что, если элементов очень много? А изменился всего один или два? Вот тут и пригодится DiffUtil. Для начала мне понадобится вспомогательный класс, который будет делать главную магию:

Как видно из кода, ничего сложного: принимает старый и новый листы, два метода на выдачу размера листов и два на сравнение — по id (например) и по содержимому. Первый сравнивающий метод нужен для определения, тот ли вообще элемент. Если у них id разные, то дальше проверять не нужно, это точно не тот же объект. А вот если id одинаковый, то можно уже подключить «тяжёлую артиллерию» — метод, сравнивающий по содержимому, который гораздо дороже по ресурсам, особенно на больших сложных объектах.

Теперь можно изменить метод на кнопке:

Разберу подробней. Сперва создаю callback, по которому будут производиться сравнения, запихиваю в него оба списка. Потом при помощи  DiffUtil.calculateDiff()  сравниваю списки. И на результате вызываю  RESULT.dispatchUpdatesTo(ADAPTER) , который всё сделает сам, да ещё и с красивой анимацией. Можно запускать и сравнивать.

Код на GitHub.

Добавить комментарий

Закрыть меню