Я включил компонент пагинации в свое приложение, и он работает отлично (почти).
У меня есть База данных + сеть модель. В базе данных изначально есть некоторые предметы, которые потребляются LivePagedListBuilder
. Я наблюдаю это LiveData<PagedList<InboxEntity>>
и в конечном итоге передаю список в PagedListAdapter#submitList(PagedList<T> pagedList)
, что-то вроде:
LiveData<PagedList<Entity>> entities;
PagedList.Config pagedListConfig =
(new PagedList.Config.Builder()).setEnablePlaceholders(true)
.setPrefetchDistance(5)
.setEnablePlaceholders(false)
.setPageSize(10)
.setInitialLoadSizeHint(10)
.build();
entities = new LivePagedListBuilder<>(DAO.getItemList(), pagedListConfig)
entities.observe(this, new Observer<PagedList<Entity>>() {
@Override
public void onChanged(@Nullable PagedList<Entity> inboxEntities) {
inboxAdapter.submitList(inboxEntities);
isFirstLoad = false;
}
});
DAO#getItemList
возвращает DataSource.Factory<Integer, Entity>
.
Я прослушиваю граничный обратный вызов и инициирую сетевой вызов, когда он достигает конца списка с поисковым вызовом. Этот вызов снова заполняет базу данных.
Есть еще одна вещь. Я зарегистрировал AdapterDataObserver
в представлении переработчика, потому что, если элемент был вставлен в начале, я должен прокрутить до верхней позиции:
RecyclerView.AdapterDataObserver adapterDataObserver = new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
if (positionStart == 0) {
layoutManager.scrollToPositionWithOffset(positionStart, 0);
}
}
};
У меня проблема с этой моделью:
После выполнения сетевого вызова база данных снова заполняется, и вызывается функция onChanged
с новым PagedList<Entity>
. Теперь, содержит ли этот постраничный список только новые элементы. Я подтвердил это.
Но метод onItemRangeInserted
также вызывается с positionStart
как 0
, что предполагает вставку элементов в начале. Но это не так. Они вставляются в конце, подтверждено инспектором stetho db.
Тогда почему onItemRangeInserted
вызывается с positionStart
как 0
? Это затрудняет мне различие, когда свежий элемент вставляется в начало адаптера, а когда элементы вставляются в конец.
Edit:
значение itemCount
равно 10, что соответствует размеру моей страницы.
В DiffCallback я просто сравниваю столбец первичного ключа двух объектов в функции areItemsTheSame
.