Как реализовать ItemKeyedDataSource для Paging 3 с новой библиотекой Paging 3 с RxSupport, например RxPagingSource
Фактически, я пытаюсь перейти с подкачки 2 на подкачку 3. Я уже успешно реализовал PageKeyedDataSource из Paging 2 с RxpagingSource в своей кодовой базе. Но когда я попытался реализовать ItemKeyedDataSource из Paging 2 в Paging library 3, я запутался, чтобы реализовать это. Я тоже пробовал кодировать. но застрял. Вот мой код.
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()
JodSliderDataSource.kt
class JodSliderDataSource @Inject constructor(
private val jobSliderRestApi: JobSliderRestApi,
private val currentJobId: Int
): RxPagingSource<Int, JobDetail>() {
override fun loadSingle(params: LoadParams<Int>): Single<LoadResult<Int, JobDetail>> {
return jobSliderRestApi.getDetailOfSelectedJob(currentJobId, 20, "next").toSingle()
.subscribeOn(Schedulers.io())
.map { jobResponse -> jobResponse.data }
.map { jobData -> toLoadResult(jobData, position) } // Don't know what to do
.onErrorReturn { LoadResult.Error(it) }
}
//Don't know what to do
private fun toLoadResult(data: JobDetail, position: Int): LoadResult<Int, JobDetail> {
/**val prevKey = if (position == 1) null else position-1
val nextKey = if (data.hasMore) position+1 else null
return LoadResult.Page(data.jobs, prevKey, nextKey)*/
}
@ExperimentalPagingApi
override fun getRefreshKey(state: PagingState<Int, JobDetail>): Int? {
return super.getRefreshKey(state)
}
}
Фактически, ранее я использовал 'currentJodId' для различения списка в пейджинге 2. но в пейджинге 3 я не получил никакой подсказки, чтобы исправить это
0 ответов
После долгих поисков я решил проблему. Вот обновленный класс JodSliderDataSource
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)
}
}