我已经开始从RecycledViewAdapter迁移到PagedListAdapter,为了实现这一点,我使用启用了ItemKeyedDataSource,BoundaryCallback和Placeholders的RxPagedListBuilder。
我指的是将数据库作为缓存的网络数据设计,这表明当我的数据源(从本地数据库加载)用完数据时,将调用BoundaryCallback。
事实证明,BoundaryCallback#onItemAtEndLoaded从未被调用过,我感到很困惑。
我的ItemKeyedDataSource从数据库返回我的第一个加载页面(15个项目)+使用loadInitial()上的callback(data,totalCount)从网络可提取的所有可用项目的totalCount(246)
当我向下滚动列表时,前15个项目按预期出现,但是随后我看到了一堆占位符,并且没有进行BoundaryCallback调用。
我试图分析应该调用BoundaryCallback#onItemAtEndLoaded的代码,其条件如下(PagedList):
private void tryDispatchBoundaryCallbacks(boolean post) {
...
final boolean dispatchEnd = mBoundaryCallbackEndDeferred
&& mHighestIndexAccessed >= size() - 1 - mConfig.prefetchDistance;
if (!dispatchBegin && !dispatchEnd) {
return;
}
if (dispatchEnd) {
mBoundaryCallbackEndDeferred = false;
}
if (post) {
mMainThreadExecutor.execute(new Runnable() {
@Override
public void run() {
dispatchBoundaryCallbacks(dispatchBegin, dispatchEnd);
}
});
} else {
dispatchBoundaryCallbacks(dispatchBegin, dispatchEnd);
}
}
您可以看到mHighestIndexAccessed必须大于size()-1-mConfig.PrefetchDistance;但是,size()的计算结果如下:
mLeadingNullCount + mStorageCount + mTrailingNullCount
简单地说,它将占位符添加到计算中(返回246)。因此,如果正在访问第16个项目,则结果为15> 246-1-15 => 15>230。换句话说,除非我一直滚动到底部(滚动到所有滚动条,否则BoundaryCallback永远不会调用它的方法)。占位符)。
我想念什么?