android - 在第 3 页滚动到 recyclerview 末尾的正确方法是什么
问题描述
有一种情况,我必须将 recyclerview 滚动到最后一个位置。问题从我使用 Paging 3 的地方开始。我不知道每次向适配器提交数据时的正确方法是什么。顺便说一句,我不会一次提交数据,但是例如每次用户向后端提交新评论时,我都必须从服务器获取新列表并提交。
这是我尝试过的。这就是我观察数据的方式:
private fun observeComments() {
exploreViewModel.commentsLiveData.observe(viewLifecycleOwner) { comments ->
commentsAdapter.submitData(viewLifecycleOwner.lifecycle, comments)
}
}
这就是我尝试将 recyclreview 滚动到最后一项的方式:
commentsAdapter.addLoadStateListener { loadStates ->
if(loadStates.refresh.endOfPaginationReached){
if(commentsAdapter.itemCount>1)
binding.rvComments.smoothScrollToPosition(commentsAdapter.itemCount-1)
}
}
我也设置app:stackFromEnd="true"
为 recyclerview 但这没有用。每当我提交新评论并获得列表时,recyclerview 会滚动到中间,我认为它会滚动到第一页结束。但我希望它滚动到列表的末尾。
任何帮助或建议将不胜感激。
解决方案
您可以实现PagingSource.getRefreshKey()
控制.load()
失效后传递给的密钥,并设置initialKey
为Pager()
控制传递给初始调用的密钥.load()
。
由于您的列表是分页的,滚动到末尾不起作用,因为您需要按顺序加载所有页面,直到到达您想要的位置,因此更好的策略是从您希望用户滚动位置开始的位置开始加载,然后让分页在页面向上滚动时预先添加。
推荐阅读
- typescript - 带有 Typescript Vuex 对象的 Vue Vuex 未知类型
- python - 在python中的日期列上使用数据透视函数
- angular - 从 Angular 8 并行处理多个 API 请求
- amazon-web-services - 将 AWS SecretManager 与 Fargate 一起使用:无法找到凭证
- python - 更改moviepy audioClip的保存位置
- vue.js - 使用 Vuex getter 时 state.user 为 null
- excel - 如何在 Excel VBA 中刷新所有内容?
- maven - 未授权和“parent.relativePath”指向没有本地 POM @ 第 4 行,第 10 列
- azure-functions - Azure App 服务功能在正常工作一个月后失败
- ruby-on-rails - 从黄瓜测试生成 REST API 文档