android - 带有占位符的 Android Pagination BoundaryCallback 无法正常工作?
问题描述
我已经开始从 RecycledViewAdapter 迁移到 PagedListAdapter,为此我使用启用了 ItemKeyedDataSource、BoundaryCallback 和占位符的 RxPagedListBuilder。
我指的是带有数据库的网络数据作为缓存设计,这表明当我的 DataSource(从本地数据库加载)用完数据时将调用 BoundaryCallback。
事实证明,BoundaryCallback#onItemAtEndLoaded 永远不会被调用,我很困惑。
我的 ItemKeyedDataSource 使用 loadInitial() 上的回调(data,totalCount)从数据库返回我的第一个加载页面(15 个项目)+ 从网络(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 永远不会调用它的方法(滚动浏览所有占位符)。
我错过了什么?
解决方案
推荐阅读
- apache-kafka - 如果一个 kafka 节点出现故障,整个集群都会失败?
- sql - 如何获取表 A 中列的最小/最大值和 B 中的值,其中 B 的行由 A 中的另一列确定?
- r - 使用 mutate() 时如何解决错误
- oracle - Oracle Enterprise Manager 登录返回页面问题
- r - 在 R 中加载任何包的问题
- python - 在列表列表的相同索引中添加数字
- azure-ad-b2c - 使用 Azure AD B2C 身份验证的 ASP.net Web 应用程序和 PowerApps 门户应用程序之间的 SSO
- python - 在导入为熊猫数据框之前从压缩的 csv 文件中获取标头
- javascript - Bootstrap 4多项目轮播无响应,桌面角落仅显示一项
- javascript - 使用 React.fowardRef 滚动 onClick 不起作用