首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Google Paging Library 3中,Api调用不会一次又一次地停止调用,而没有任何滚动

在Google Paging Library 3中,Api调用不会一次又一次地停止调用,而没有任何滚动
EN

Stack Overflow用户
提问于 2020-08-25 00:51:55
回答 2查看 696关注 0票数 4

我想实现分页来在我的应用程序中显示我想要的项目视图的一大块列表。这就是为什么我选择使用谷歌新发布的分页库,即分页库3。我在我的应用程序中使用Rxjava,Livedata和ViewModel。在实现分页库之后,我面临着一个奇怪的问题。当我调用获取list的方法时,它一次又一次地调用,并且没有停止调用。事实上,它会自动增加页码,尽管我没有滚动列表。下面是我尝试过的代码

JobListRestApi.kt

代码语言:javascript
复制
interface JobListRestApi {
    @GET("job/list")
    fun getJobResponse(
        @Query("page") pageNumber: Int
    ): Single<Response<JobResponse>>
}

JobListDataSource.kt

代码语言:javascript
复制
class JobListDataSource @Inject constructor(
    private val jobListRestApi: JobListRestApi
): RxPagingSource<Int, Job>() {

    override fun loadSingle(params: LoadParams<Int>): Single<LoadResult<Int, Job>> {
        val position = params.key ?: 1

        return jobListRestApi.getJobResponse(position).toSingle()
            .subscribeOn(Schedulers.io())
            .map { jobResponse -> jobResponse.jobData.jobs }
            .map { jobs -> toLoadResult(jobs, position) }
            .onErrorReturn { LoadResult.Error(it) }
    }

    private fun toLoadResult(data: ArrayList<Job>, position: Int): LoadResult<Int, Job> {
        val prevKey = if (position == 1) null else position-1
        val nextKey = if (position == data.size) null else position+1

        return LoadResult.Page(data, prevKey, nextKey)
    }

}

JobListRepositoryImpl.kt

代码语言:javascript
复制
class JobListRepositoryImpl @Inject constructor(
    private val jobListDataSource: JobListDataSource
): JobListRepository {

    override fun getJobs(): Flowable<PagingData<Job>> {
        return Pager(PagingConfig(pageSize = 20)) {
            jobListDataSource
        }.flowable
    }
}

JobListViewModel.kt

代码语言:javascript
复制
class JobListViewModel @Inject constructor(
    private val jobListRepository: JobListRepository
): BaseViewModel() {

    val jobs: MutableLiveData<PagingData<Job>> = MutableLiveData()

    fun getJobs() {
        if (jobs.value == null) {
            compositeDisposable += jobListRepository.getJobs()
                .subscribe({
                    jobs.value = it
                }, {
                    handleException(it)
                })
        }
    }

}

JobListFragment.kt

代码语言:javascript
复制
class JobListFragment : BaseFragment<JobListViewModel>() {

    private val jobAdapter: JobAdapter by lazy {
        JobAdapter { }
    }

    override fun getLayoutResource() = R.layout.fragment_job_list

    override fun initWidget() {
        job_recycler_view.adapter = jobAdapter
    }

    override fun onResume() {
        super.onResume()
        viewModel.getJobs()
    }

    override fun observeLiveData() {
        observe(viewModel.jobs) {
            jobAdapter.submitData(lifecycle, it)
        }
    }
}

输出日志为https://base-url/job/list?page=1

https://base-url/job/list?page=2

https://base-url/job/list?page=3

https://base-url/job/list?page=4

https://base-url/job/list?page=5

https://base-url/job/list?page=6

https://base-url/job/list?page=7

除非我转到RecyclerView中块的最后一项并滚动列表,否则我如何停止调用串行api

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-25 19:29:10

最终,我得到了错误。事实上,问题出在我的Http响应数据中。更新后的DataSource如下所示

JobListDataSource.kt

代码语言:javascript
复制
class JobListDataSource @Inject constructor(
    private val jobListRestApi: JobListRestApi
): RxPagingSource<Int, Job>() {

    override fun loadSingle(params: LoadParams<Int>): Single<LoadResult<Int, Job>> {
        val position = params.key ?: 1

        return jobListRestApi.getJobResponse(position).toSingle()
            .subscribeOn(Schedulers.io())
            .map { jobResponse -> jobResponse.jobData }
            .map { jobData -> toLoadResult(jobData, position) }
            .onErrorReturn { LoadResult.Error(it) }
    }

    private fun toLoadResult(data: JobData, position: Int): LoadResult<Int, Job> {
        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)
    }

}
票数 2
EN

Stack Overflow用户

发布于 2020-08-25 17:20:03

您可以通过在LoadResult.Page中返回prevKeynullnextKey来告诉分页没有更多要加载的内容

因为它是无限附加的,所以看起来您从未将nextKey设置为null。也许你想检查的是data.isEmpty()而不是key == data.size

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63565381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档