5

我在我的项目中使用 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, config, true) }
    .flow.cachedIn(viewModelScope)

相关 Gradle 部分:

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

任何帮助,将不胜感激。

4

1 回答 1

1

就我而言,这种recipeId数据类型很长,但是当我将其更改为字符串时,它工作正常。然后,而不是NestedScrollView使用SmartNestedScrollview

@Entity(tableName = "table_recipe")
data class RecipeList(
        @PrimaryKey
        @field:SerializedName("recipe_id") var recipeId : String,
        @field:SerializedName("title") var title: String? = null,
)
于 2021-09-06T16:48:52.030 回答