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 中更新当前页面或更新数据
Android Paging 3 在 invalidate() 上清除 recyclerview