从 Paging Library 3 Android 中的 PagingSource 加载的两个连续页面中传递了相同的值作为 nextKey

问题描述 投票:0回答:1

我从分页2迁移到分页3。我尝试将分页2的ItemKeyedDataSource实现到分页库3。但我面临的问题是,在加载的两个连续页面中传递了相同的值(currentJodId)作为nextkey。然后应用程序崩溃后。但如果我在数据源中添加“keyReuseSupported = true”,应用程序不会崩溃。但它开始调用与 nextkey 相同的项目 id。

JobSliderRestApi.kt

@GET("job/list/slides")
fun getDetailOfSelectedJob(
    @Query("current_job") currentJodId: Int?,
    @Query("limit") jobLimit: Int?,
    @Query("search_in") fetchType: String?
): Single<Response<JobViewResponse>>

JobViewResponse.kt

data class JobViewResponse(
    @SerializedName("data") val data: ArrayList<JobDetail>?
) : BaseResponse()

JobDetail.kt

data class JobDetail(
    @SerializedName("job_id") val jobId: Int,
    @SerializedName("tuition_type") val jobType: String?,
    @SerializedName("class_image") val jobImage: String,
    @SerializedName("salary") val salary: String,
    @SerializedName("no_of_student") val noOfStudent: Int,
    @SerializedName("student_gender") val studentGender: String,
    @SerializedName("tutor_gender") val preferredTutor: String,
    @SerializedName("days_per_week") val daysPerWeek: String?,
    @SerializedName("other_req") val otherReq: String?,
    @SerializedName("latitude") val latitude: Double?,
    @SerializedName("longitude") val longitude: Double?,
    @SerializedName("area") val area: String,
    @SerializedName("tutoring_time") val tutoringTime: String?,
    @SerializedName("posted_date") val postedDate: String?,
    @SerializedName("subjects") val subjects: String,
    @SerializedName("title") val title: String
)

JodSliderDataSource.kt

class JodSliderDataSource @Inject constructor(
    private val jobSliderRestApi: JobSliderRestApi
): RxPagingSource<Int, JobDetail>() {

//    override val keyReuseSupported = true

    @ExperimentalPagingApi
    override fun getRefreshKey(state: PagingState<Int, JobDetail>): Int? {
        return state.anchorPosition?.let {
            state.closestItemToPosition(it)?.jobId
        }
    }

    override fun loadSingle(params: LoadParams<Int>): Single<LoadResult<Int, JobDetail>> {
        return jobSliderRestApi.getDetailOfSelectedJob(42673, 2, "next").toSingle()
            .subscribeOn(Schedulers.io())
            .map { jobResponse -> toLoadResult(jobResponse.data) }
            .onErrorReturn { LoadResult.Error(it) }
    }

    private fun toLoadResult(data: ArrayList<JobDetail>): LoadResult<Int, JobDetail> {
        return LoadResult.Page(data = data, prevKey = null, nextKey = data.lastOrNull()?.jobId)
    }
}
android-studio pagination rx-java2
1个回答
3
投票

我遇到了同样的错误,这对我有用。在 JodSliderDataSource 类的 toLoadResult 方法中,通过从响应数据中获取页码并加一来设置 nextKey 参数值。

    private fun toLoadResult(
        data: ArrayList<JobDetail>
    ): LoadResult<Int, JobDetail>  {
        return LoadResult.Page(
        data = data, 
        prevKey = null,
        nextKey = data.lastOrNull()?.jobId + 1 // Add one to the page number here.
    )
}
© www.soinside.com 2019 - 2024. All rights reserved.