分页列表(数据库+网络)在更新数据库记录时触发onItemAtEndLoaded

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

我正在使用分页列表库构建一个recyclerView。我从本地数据库中获取项目,当它到达最后一个数据库时,会触发onItemAtEndLoaded(),然后它调用API从网络中获取。

这些项目包含一个喜欢的变量,因此当用户单击它时,我会更新数据库中的项目并刷新列表中的项目。

问题是,当我单击列表的最后一项并在数据库中对其进行更新时,将触发功能onItemAtEndLoaded(),并从网络请求新项。因此,我不想被触发,因为没有东西可以获取。

这是正常行为吗?如何避免被称为?

干杯!

android android-recyclerview android-room android-architecture-components pagedlist
1个回答
1
投票
由于[只要房间碰到桌子,就会调用onItemAtEndLoaded()(无论是通过@Query还是@Update Dao函数发生,因此,我需要找到一种方法来在有意义的时候阻止onItemAtEndLoaded()的逻辑。] >

就我而言,我正在获取可下载文件URL的页面列表。当用户想要下载这样的文件时,我会更新数据库中的下载进度。因此,任何这些进度更新都会触发从API提取下一页。

因此,我告诉我的边界回调至少要获取直到最后一个页码。我可以从api响应中获取此信息。所以这是一些代码:

import retrofit2.Callback abstract class NetworkBoundaryCallback<T> : Callback<T> { protected var nextPageNumber = 1 private var maxPageNumber = Int.MAX_VALUE protected val ioExecutor: ExecutorService = Executors.newSingleThreadExecutor() private val helper = PagingRequestHelper(ioExecutor) fun onItemAtEndLoaded() { helper.runIfNotRunning(PagingRequestHelper.RequestType.AFTER) { pagingRequestCallback = it // check if next page number would exceed maxPageNumber if (nextPageNumber > maxPageNumber) { // if yes, return with failure message. val throwable = IllegalArgumentException("Maximum page number of $maxPageNumber already fetched") pagingRequestCallback.recordFailure(throwable) } else { // otherwise enqueue api call for next page createRequestCall().enqueue(this) } } } override fun onResponse(call: Call<T>, response: Response<T>) { ioExecutor.execute { val responseBody = response.body() if (responseBody !is PagedResponse<*>) return@execute // calculate maximum number of pages maxPageNumber = ceil(responseBody.totalItems / PAGE_SIZE).toInt() nextPageNumber = responseBody.page + 1 doOnResponse(responseBody) } }

使用此附加变量(maxPageNumber),现在对我来说很好用。

The PagingRequestHelper can be found here
© www.soinside.com 2019 - 2024. All rights reserved.