Пример использования Android DiffUtil

Обсуждение статей из раздела Блог
Ответить
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Пример использования Android DiffUtil

Сообщение damager82 » 02 окт 2017, 23:38

В нашем Telegram чате иногда проскакивает следующий вопрос: Как правильно обновлять данные в списке?
Спрашивающий обычно подразумевает два варианта ответа:
1) Передавать новые данные в адаптер и вызывать метод notifyDataSetChanged, чтобы рефрешнуть RecyclerView
2) Создавать новый адаптер, давать ему новые данные и передавать этот адаптер в RecyclerView.setAdapter()
Оба этих варианта не являются правильными, хотя технически они вполне рабочие.


Click here to read this article!
Последний раз редактировалось damager82 29 ноя 2017, 17:27, всего редактировалось 20 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Final12345
Сообщения: 1
Зарегистрирован: 20 окт 2016, 12:01

Re: Пример использования Android DiffUtil

Сообщение Final12345 » 09 ноя 2017, 11:06

Если мы говорим о "тяжелых" списках, формирование и обновление которых занимает время, есть гениальный ответ на вопрос как обновить список - НЕ обновлять список. К примеру можно взглянуть на то как Гугл обновляет список приложений в своем лаунчере (AOSP -> Launcher3). Основной список формируется один раз, а вместо того чтобы при изменениях перелопачивать весь список, параллельно заполняются изначально пустые списки добавленных приложений, удаленных приложений, скрытых (выключенных) приложений, и т.п. И при вызове app drawer просто формируется вывод из нескольких списков. На это теряется несколько лишних милисекунд, но зато нет такой ситуации, когда после любого изменения несколько секунд нельзя вызвать список, потому что он переформировывается.

almaz010891
Сообщения: 4
Зарегистрирован: 18 апр 2013, 20:25

Re: Пример использования Android DiffUtil

Сообщение almaz010891 » 19 мар 2018, 16:37

Подскажите, если размеры старого и нового листов отличаются, DiffUtils можно использовать? Или этот метод заранее подразумевает то, что размеры старого и нового списков должны быть одинаковыми?

robesh
Сообщения: 1
Зарегистрирован: 14 июл 2018, 06:09

Re: Пример использования Android DiffUtil

Сообщение robesh » 14 июл 2018, 06:11

А можно ли как-нибудь замутить с ArrayAdapter вместо RecyclerView.Adapter?

Роман
Сообщения: 1
Зарегистрирован: 02 авг 2020, 09:23

Re: Пример использования Android DiffUtil

Сообщение Роман » 02 авг 2020, 09:24

Код: Выделить всё

void onUpdateClick() {
   List<Product> productList = new LinkedList<>();
   productList.add(new Product(2, "Name21", 200));
   productList.add(new Product(3, "Name3", 300));
   productList.add(new Product(4, "Name4", 400));
   productList.add(new Product(5, "Name5", 501));
   productList.add(new Product(6, "Name6", 600));
 
   ProductDiffUtilCallback productDiffUtilCallback = new ProductDiffUtilCallback(adapter.getData(), productList);
   DiffUtil.DiffResult productDiffResult = DiffUtil.calculateDiff(productDiffUtilCallback);
 
   adapter.setData(productList);
   productDiffResult.dispatchUpdatesTo(adapter);
}
adapter.setData(productList); - можно не писать же ?

Ответить