10

С ListView мы имели хороший родной шаблон для отображения некоторых данных из БД в список:Как использовать ContentObserver с RecyclerView?

DB ->ContentProvider ->CursorLoader ->CursorAdapter ->ListView

Этот подход был хорош с точки зрения уровня данных разделение, производительность и автоматические обновления данных. Но этот шаблон не подходит для нового RecyclerView. Есть несколько подходов к имитируют старое поведение:

Using the recyclerview with a database

Но есть проблема с использованием старого стиля notifyDataSetChangedRecyclerView с. Он не может использовать функции ItemAnimator, он теряет положение прокрутки, и он просто неэффективен.

Итак, как мы можем извлечь выгоду из уведомлений об изменении размера при использовании DB, завернутых в ContentProvider? Cursor статичен, и для получения новых данных нам нужно получить новый Cursor. Таким образом, нам кажется, что нам понадобится пользовательский промежуточный уровень данных, который объединит данные из Cursors и выведет List объектов на RecyclerView.Adapter. Кроме того, нам нужно вручную отобразить ContentObserveronChange() событий для уведомлений RecyclerView. Это также означает, что нам придется избавиться от CursorLoader. Это невероятная работа для такой основной задачи.

Есть ли лучшее решение?

ответ

0

Вы можете использовать класс DiffUtils, чтобы вычислить различия между старым и новым курсором.

При его использовании вам просто нужно реализовать два метода:

  • areItemsTheSame() знать, если два элемента представляют один и тот же логический элемент (даже если содержание отличается). Обычно вы основываете ответ на поле идентификации вашего предмета;
  • areContentsTheSame() знать, имеют ли два элемента, представляющие один и тот же логический элемент, неизмененный контент.

После того, как различия вычисляются, вы можете просто применить его к адаптеру, и он будет автоматически вызвать notifyItemChanged(), notifyItemInserted() или notifyItemRemoved() accodingly.

Смежные вопросы