【问题标题】:How to implement PagingSource.getRefreshKey for cursor based pagination - Android Jetpack Paging 3如何为基于光标的分页实现 PagingSource.getRefreshKey - Android Jetpack Paging 3
【发布时间】:2021-05-25 16:19:13
【问题描述】:

我正在尝试使用Android Paging Library 3 实现基于光标的分页(基于GraphQL Relay spec),但我不知道如何实现getRefreshKey

这是我尝试过的:

data class PagingKey(
    val before: String? = null,
    val after: String? = null,
)

class MoviePagingSource() : PagingSource<PagingKey, Movie>() {
    override suspend fun load(params: LoadParams<PagingKey>): LoadResult<PagingKey, Movie> {
        return try {
            val response = fetchMovies(
                before = params.key?.before,
                after = params.key?.after,
                pageSize = params.loadSize,
            )

            LoadResult.Page(
                data = response.edges.map { mapEdgeToMovie(it) },
                prevKey = if (response.pageInfo.hasPreviousPage) PagingKey(
                    before = response.pageInfo.startCursor
                ) else null,
                nextKey = if (response.pageInfo.hasNextPage) PagingKey(
                    after = response.pageInfo.endCursor
                ) else null,
            )
        } catch (exception: Exception) {
            LoadResult.Error(exception)
        }
    }

    override fun getRefreshKey(state: PagingState<PagingKey, Movie>): PagingKey? {
        // TODO: What to return here?
    }
}

在所有示例中,我发现页码只是递增/递减,但这不适用于光标。

实现这一点的正确方法是什么?


在它被错误地标记为重复之前,我已经看到了this question。这不能回答我的问题,因为他们的 API 被称为 service.getOrders(query, params.key ?: "", 10),而不是像上面的 fetchMovies 这样的单独的 before/after 参数。

【问题讨论】:

    标签: android kotlin android-jetpack android-paging android-paging-3


    【解决方案1】:

    您可以做的是获取要重新加载的页面的索引,然后转到下一页获取prevKey或上一页获取nextKey

     override fun getRefreshKey(
        state: PagingState<PagingKey, Movie>,
    ): PagingKey? {
        return state.anchorPosition?.let { anchorPosition ->
            val anchorPageIndex = state.pages.indexOf(state.closestPageToPosition(anchorPosition))
            state.pages.getOrNull(anchorPageIndex + 1)?.prevKey ?: state.pages.getOrNull(anchorPageIndex - 1)?.nextKey
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-12
      • 2020-06-30
      • 2021-04-09
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      相关资源
      最近更新 更多