我正在使用新的Android Paging库来获取具有无限滚动的RecyclerView。我不明白为什么在我这样设置PagedList时库不触发loadAfter()方法:

val config: PagedList.Config = PagedList.Config.Builder()
                .setEnablePlaceholders(false)
                .setPageSize(10)
                .setPrefetchDistance(1)
                .setInitialLoadSizeHint(10)
                .build()
val pageList = PagedList.Builder(LookDataSource(lookList), config)
                .setInitialKey(0)
                .setMainThreadExecutor(MainThreadExecutor())
                .setBackgroundThreadExecutor(PaginationThreadPoolExecutor())
                .setBoundaryCallback(LookBoundaryCallback())
                .build()

注意:我的prefetchDistance为1,因为我想在看到最后一个项目时加载另一批数据。该文档说0将永远不会加载更多数据

我的数据源是一个 PageKeyedDataSource ,键是页面的索引。

我已经研究了 ContiguousPagedList 的源代码,它是在您使用PageKeyedDataSource时创建的特定PagedList,我无法理解它们:
@MainThread
@Override
protected void loadAroundInternal(int index) {
    int prependItems = mConfig.prefetchDistance - (index - mStorage.getLeadingNullCount());
    int appendItems = index + mConfig.prefetchDistance
            - (mStorage.getLeadingNullCount() + mStorage.getStorageCount());

    mPrependItemsRequested = Math.max(prependItems, mPrependItemsRequested);
    if (mPrependItemsRequested > 0) {
        schedulePrepend();
    }

    mAppendItemsRequested = Math.max(appendItems, mAppendItemsRequested);
    if (mAppendItemsRequested > 0) {
        scheduleAppend();
    }
}

根据我的配置,当我看到最后一个项目时,appendItems值为0




  • 索引+ 9(页面大小为10的最后一项)
  • prefetchDistance是1
  • leadNullCount始终为0(不确定我是否了解此属性)
  • storageCount是我在上面配置的pageSize(根据此类的源代码)





  • 基于此,由于mAppendItemsRequested始终也为0,因此永远不会调用scheduleAppend()。

    我发现在滚动上实际加载更多数据的唯一方法是将我的prefetchDistance设置为大于1的任何值。话虽如此,这似乎比解决此问题的方法要好得多。

    最佳答案

    用PagedListAdapter替换ListAdapter

    07-26 09:41