Страница 1 из 1

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

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


Click here to read this article!

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

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

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

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

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

Добавлено: 14 июл 2018, 06:11
robesh
А можно ли как-нибудь замутить с ArrayAdapter вместо RecyclerView.Adapter?

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); - можно не писать же ?