С ListView
у нас был хороший собственный шаблон для отображения некоторых данных из db в список:
DB
-> ContentProvider
-> CursorLoader
-> CursorAdapter
-> ListView
Этот подход был хорош с точки зрения разделения слоев данных, производительности и автоматического обновления данных. Но этот шаблон не очень подходит для нового RecyclerView
. Есть несколько подходов к имитации старого поведения:
Использование recyclerview с базой данных
Но есть проблема с использованием старого стиля notifyDataSetChanged
с RecyclerView
. Он не может использовать функции ItemAnimator, теряет позицию прокрутки и просто неэффективен.
Итак, как мы можем извлечь выгоду из детальных уведомлений об изменениях при использовании БД, завернутой в ContentProvider
? Cursor
является статическим, и чтобы получить из него новые данные, нам нужно получить новый Cursor
. Итак, похоже, нам понадобится пользовательский промежуточный слой данных, который объединит данные из курсоров и предоставит List
сущностей RecyclerView.Adapter
. Кроме того, нам придется вручную сопоставлять события ContentObserver
onChange()
с уведомлениями RecyclerView. Это также означает, что нам придется избавиться от CursorLoader. Это невероятный объем работы для такой простой задачи.
Есть ли лучшее решение?