我正在使用分页列表库构建一个recyclerView。我从本地数据库中获取项目,当它到达最后一个数据库时,会触发onItemAtEndLoaded()
,然后它调用API从网络中获取。
这些项目包含一个喜欢的变量,因此当用户单击它时,我会更新数据库中的项目并刷新列表中的项目。
问题是,当我单击列表的最后一项并在数据库中对其进行更新时,将触发功能onItemAtEndLoaded()
,并从网络请求新项。因此,我不想被触发,因为没有东西可以获取。
这是正常行为吗?如何避免被称为?
干杯!
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