0

我想知道是否可以将 paging3 库用于在其查询中不支持“page=RANDOM_NUMBER”的 API?例如,我有一个 API,可以在其中添加自定义查询,如“number=50”,结果将显示 50 个项目。我很困惑,如果没有 page=RANDOM_NUMBER 查询,我将无法将该库用于我的 API。有人可以给我答案吗?

4

1 回答 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,并且在没有更多项目或您从网络获得空响应的情况下(由于位于列表的末尾),你可以返回nullnextKey告诉 Paging 在那个方向上没有更多的东西可以加载。

请注意,我没有介绍 prepend / prevKey,但如果您的情况不支持它,您可以通过null

如果您不支持 prepend,您将无法从列表中间恢复加载,因此您需要 return nullin getRefreshKey()which 告诉 Paging 在配置更改的情况下使用什么键从滚动位置恢复加载,等等

于 2020-08-16T16:42:52.413 回答