我想知道是否可以将 paging3 库用于在其查询中不支持“page=RANDOM_NUMBER”的 API?例如,我有一个 API,可以在其中添加自定义查询,如“number=50”,结果将显示 50 个项目。我很困惑,如果没有 page=RANDOM_NUMBER 查询,我将无法将该库用于我的 API。有人可以给我答案吗?
问问题
89 次
1 回答
1
Paging3 支持任意键类型(您定义键及其使用方式)。为了增量加载数据,您需要能够指定“在___之后加载”,否则在初始加载后无法继续加载数据。如果这是独立跟踪的内容,例如 cookie 或会话令牌,那么您可以尝试将 maxSize 设置为无界,并为 nextKey 使用任何非空值。
编辑:由于您提到您处于项目键控场景中,您的下一个加载基于您加载的最后一个项目,您可能会执行以下操作:
class MyPagingSource : PagingSource<String, Item>(
val api: NetworkApi,
) {
override suspend fun load(params: LoadParams): LoadResult<String, Item> {
try {
val result = withContext(Dispatchers.IO) {
api.loadPage(after_id = params.key)
}
return LoadResult.Page(
data = result.items,
nextKey = result.items.lastOrNull().id,
)
} catch (exception: IOException) {
return LoadResult.Error(exception)
}
}
}
基本上,当用户接近加载数据的底部时,您传递给的任何值nextKey
都会传递给LoadParams.key
,并且在没有更多项目或您从网络获得空响应的情况下(由于位于列表的末尾),你可以返回null
来nextKey
告诉 Paging 在那个方向上没有更多的东西可以加载。
请注意,我没有介绍 prepend / prevKey
,但如果您的情况不支持它,您可以通过null
。
如果您不支持 prepend,您将无法从列表中间恢复加载,因此您需要 return null
in getRefreshKey()
which 告诉 Paging 在配置更改的情况下使用什么键从滚动位置恢复加载,等等
于 2020-08-16T16:42:52.413 回答