Android Paging 库不会触发 loadAfter()

Posted

技术标签:

【中文标题】Android Paging 库不会触发 loadAfter()【英文标题】:Android Paging library doesn't fire loadAfter() 【发布时间】:2018-06-09 19:05:05 【问题描述】:

我正在使用新的 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 将永远不会加载更多数据

我的DataSource是一个PageKeyedDataSource,key是页面的索引。

我查看了 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

int appendItems = index + mConfig.prefetchDistance - (mStorage.getLeadingNullCount() + mStorage.getStorageCount());

index + 9(最后一项,页面大小为 10 项) prefetchDistance 为 1 leadingNullCount 始终为 0(不确定我是否理解此属性) storageCount是我上面配置的pageSize(根据这个类的源码)

给了

int appendItems = 9 + 1 (0 - 10)

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

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

【问题讨论】:

你发现了吗?我也有同样的问题。 你能粘贴你的分页源实现吗?也许只有 loadInitial 的主体? 发布你的数据源类 我在我的大型程序中也遇到了同样的问题。具有相同结构/配置的小示例程序可以正常工作。 我遇到了同样的问题;它发生在我身上是因为我忘了用 PagedListAdapter 替换 ListAdapter !! 【参考方案1】:

将 ListAdapter 替换为 PagedListAdapter

【讨论】:

以上是关于Android Paging 库不会触发 loadAfter()的主要内容,如果未能解决你的问题,请参考以下文章

在 Paging 3 库 Android Kotlin 中更新当前页面或更新数据

Jetpack-paging3看会了吗

Android Paging3 Footer踩坑优化

Android Paging 3 在 invalidate() 上清除 recyclerview

Android jetpack的Paging和Room结合使用

反思|Android 列表分页组件Paging的设计与实现:架构设计与原理解析