我已经在我的应用程序中集成了分页组件,它工作得非常好(几乎)。我有数据库+网络模型。数据库最初有一些项目被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
使用 new 调用函数PagedList<Entity>
。现在,这个分页列表是否只包含新项目。我已经证实了这一点。
但是onItemRangeInserted
方法也是用positionStart
as调用的0
,这表明项目是在开头插入的。但他们不是。它们被插入到最后,由 stetho db 检查员确认。
那么为什么onItemRangeInserted
被称为positionStart
as0
呢?这让我很难区分何时在适配器的开头插入新项目以及何时在末尾插入项目。
编辑:
的值为itemCount
10,这是我的页面大小。
在 DiffCallback 中,我只是比较了函数中两个实体的主键列areItemsTheSame
。