Я создал пример проекта, чтобы показать проблему, с которой я столкнулся при использовании RecyclerView, Room и Paging, а именно: RecyclerView неожиданно прокручивается вниз при обновлении данных.
https://github.com/HappyPeng2x/RoomRecyclerViewExample
Приложение имеет базу данных Room, и я использую адаптер, производный от PagedListAdapter, для отображения его значений в RecyclerView.
Запрос рассматривается, как показано в приведенном ниже коде, поэтому каждое обновление таблицы будет отражаться адаптером.
PagedList.Config plConfig =
new PagedList.Config.Builder().setEnablePlaceholders(false)
.setPrefetchDistance(10)
.setPageSize(20).build();
new LivePagedListBuilder<>
(mDB.getMyDao().getAllPaged(), plConfig)
.build()
.observe(this, new Observer<PagedList<MyEntry>>() {
@Override
public void onChanged(PagedList<MyEntry> myList) {
adapter.submitList(myList);
}
});
Для тестирования я заполняю таблицу 1000 пар ключ/значение. Ключи начинаются с 1 и заканчиваются на 1000, и все значения инициируются как ИСХОДНЫЕ.
Я включаю в каждый отображаемый элемент кнопку-переключатель; нажатие на нее изменит значение с INITIAL на FINAL и наоборот.
При нажатии кнопки-переключателя на 155-м элементе отображаемое значение изменяется с INITIAL на FINAL без каких-либо проблем.
При выполнении той же операции с 243-м элементом нажатие кнопки приводит к прокрутке RecyclerView, что не ожидается.
Проблема повторяется каждый раз, когда нажимается кнопка вокруг этой позиции.
Я снял видео, чтобы можно было наблюдать за проблемой.
Я довольно долго боролся с этой проблемой, и мне немного стыдно, потому что это похоже на базовое использование архитектурных компонентов, поэтому я был бы очень рад получить любую помощь.