Android Paging (3) 一次性加载所有页面

问题描述

我在我的项目中使用了 Android Paging 3 库,以便逐页加载我的数据。在这个项目中,我没有使用数据库,这意味着我使用的是 network only requests。问题是它不是根据用户滚动加载页面,而是首先加载所有页面。这是我用于项目分页部分的代码

我的 RxPagingSource 类:

class ReviewPagingSource constructor(
    private val network: Network,private val filter: ReviewFilter,private val config: Config,private val cacheFirstResponse: Boolean
) : RxPagingSource<Int,Review>() {

    override fun loadSingle(params: LoadParams<Int>): Single<LoadResult<Int,Review>> {
        return network.getReviews(
            filter.copy(page = (params.key ?: 0),pageSize = params.loadSize),config,cacheFirstResponse
        )
            .subscribeOn(Schedulers.io())
            .map { toLoadResultPage(it,params) }
            .onErrorResumeNext {
                when (it) {
                    is TimeoutException,is NoInternetException,is NetworkException,is UnexpectedResponseException -> Single.just(
                        LoadResult.Error(it)
                    )
                    else -> Single.error(it)
                }
            }
    }

    private fun toLoadResultPage(
        response: DataResponse<Review>,params: LoadParams<Int>
    ): LoadResult<Int,Review> {
        val page = params.key ?: 0
        return LoadResult.Page(
            response.results!!,if (page <= 0) null else page - 1,if (response.count ?: response.results?.count() ?: 0 < params.loadSize) null else page + 1,LoadResult.Page.COUNT_UNDEFINED,LoadResult.Page.COUNT_UNDEFINED
        )
    }

    override fun getRefreshKey(state: PagingState<Int,Review>): Int? {
        return state.anchorPosition?.let { state.closestPagetoPosition(it) }?.nextKey
    }
}

我的寻呼机是:

Pager(PagingConfig(pageSize = 5,initialLoadSize = 5,)) 
    { ReviewPagingSource(network,filter,true) }
    .flow.cachedIn(viewmodelScope)

相关 Gradle 部分:

implementation "androidx.paging:paging-runtime-ktx:3.0.0-alpha13"
implementation "androidx.paging:paging-rxjava3:3.0.0-alpha13"

任何帮助将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)