首页 > 解决方案 > 带有占位符的 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 永远不会调用它的方法(滚动浏览所有占位符)。

我错过了什么?

标签: androidpagination

解决方案


推荐阅读