我正在按照这个例子来实现分页库,使用TMDB Api。
当我滚动列表到达边界条件时,它总是会滚回第一页。
我认为RemoteMediator类存在问题导致了这个问题,但我几乎是从Google的示例中复制的...
我想问题在于“LoadType = PREPEND”被调用时我向下滚动列表。适配器首先APPEND下一页,但然后检测到上一页的顶部边界条件,并决定进行PREPEND,导致出现问题吗? 我不确定如何解决这个问题。 我已经尝试更改pager的配置,但它不起作用。
谢谢!
我正在按照这个例子来实现分页库,使用TMDB Api。
当我滚动列表到达边界条件时,它总是会滚回第一页。
我认为RemoteMediator类存在问题导致了这个问题,但我几乎是从Google的示例中复制的...
我想问题在于“LoadType = PREPEND”被调用时我向下滚动列表。适配器首先APPEND下一页,但然后检测到上一页的顶部边界条件,并决定进行PREPEND,导致出现问题吗? 我不确定如何解决这个问题。 我已经尝试更改pager的配置,但它不起作用。
谢谢!
我曾经遇到过同样的问题,但是我的解决办法是从SearchRepositoriesActivity
中删除以下行:
private fun initSearch(query: String) {
/* Some code here */
// Remove these lines
/*
lifecycleScope.launch {
@OptIn(ExperimentalPagingApi::class)
adapter.dataRefreshFlow.collect {
binding.list.scrollToPosition(0)
}
}
*/
}
RecyclerView
在请求(用于新存储库搜索的请求)完成后滚动回顶部,这正是我的情况:只有在OkHttp记录接收到请求结果后RecyclerView
才回到顶部。
我无法完全理解为什么网络版本可以正常工作,但是网络+数据库就不行。如果我正确地理解了代码,那么当发生LoadState.REFRESH
事件时,此流应该仅被通知一次。我认为存在一个隐藏的LoadState.REFRESH
,但在RemoteMediator
上没有接收到。一旦我删除了上面的代码,屏幕仍然会闪烁,因为它会迅速转移到Loading
状态。您可以通过如下方式向addLoadStateListener
添加日志(位于这里)来查看它:
adapter.addLoadStateListener { loadState ->
// Add this log
Log.d("UI_PAGING", "source: ${loadState.source.refresh}, remote: ${loadState.refresh}")
// Only show the list if refresh succeeds.
binding.list.isVisible = loadState.source.refresh is LoadState.NotLoading
// Show loading spinner during initial load or refresh
binding.progressBar.isVisible = loadState.source.refresh is LoadState.Loading
// Show the retry state if initial load or refresh fails.
binding.retryButton.isVisible = loadState.source.refresh is LoadState.Error
/* some other code here */
}
Room
就会改变刷新状态。我遇到了同样的问题,但是我找到了解决方案。 这可能是由于数据库索引引起的。检查您的实体类的主键,通常为id,但id的大小可能会混乱。当Room插入数据时,它将根据主键的大小进行插入,这会导致您的数据库和api响应数据的顺序错误。
解决方案是在您的实体类中重新定义另一个主键,并让它自动增长,例如databaseId,以便Room数据库的插入顺序正确。这可以解决列表滑动的问题。
@Entity(tableName = "articles")
data class Article(
@PrimaryKey(autoGenerate = true)
val databaseId: Int,
@field:SerializedName("id")
val id: Int,
@field:SerializedName("title")
val title: String,
@field:SerializedName("apkLink")
val apkLink: String,
@field:SerializedName("audit")
val audit: Int
loadState.mediator
而不是loadState.source
来检查加载状态。 - Eduardo macedo