android - 恢复准确的 Recyclerview 位置 - 包含不同大小的项目列表
问题描述
在尝试了许多解决方案后,我仍然无法解决问题。请帮忙。
我的 Android 应用程序有一个包含大项目列表的 Recyclerview。一个项目可以是 2 行或 35 行。
从 Recyclerview 屏幕切换到另一个屏幕时,我想保存确切的位置,这样我就可以回到完全相同的位置。
当然,我花了很多时间寻找解决方案,但没有找到明确的解决方案。一些解决方案如下所示:
1 - 使用:computeVerticalScrollOffset:
int offset = recyclerView.computeVerticalScrollOffset();
2 - 使用:findFirstVisibleItemPosition 和 getTop() 和 paddingTop()
int index = linearLayoutManager.findFirstVisibleItemPosition();
View v = recyclerView.getChildAt(0);
int offset = (v == null) ? 0 : (v.getTop() - recyclerView.getPaddingTop());
3 - 使用 findFirstVisibleItemPosition 和 getTop()
int firstVisiblePosition = linearLayoutManager.findFirstVisibleItemPosition();
View visibleEntry = linearLayoutManager.findViewByPosition( firstVisiblePosition);
int offset = visibleEntry.getTop();
使用这些位置,我可以滚动到确切的位置:
recyclerView.scrollToPosition( index);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
recyclerView.scrollBy(0, - offset);
}
}, 500);
所有版本都不正确。
如何解决当前位置...并轻松恢复?
ListView 有一个简单的解决方案,但我当然不想回到 ListView ;-)
解决方案
终于找到了一个很好的答案!
保存“位置”是一个已知的解决方案:
int position = linearLayoutManager.findFirstVisibleItemPosition();
View visibleChildView = recyclerView.getChildAt(0);
int offset = (visibleChildView == null) ? 0 : (visibleChildView .getTop() - recyclerView.getPaddingTop());
但是,通过 linearLayoutManager 使用位置对我来说是新的:
if ( position != -1) {
linearLayoutManager.scrollToPositionWithOffset( position, offset);
}
令人惊讶的是,这个选项看起来非常像旧的 Listview 解决方案 ;-)
推荐阅读
- matlab - 以表格格式打印 matlab 结构
- python - 在文件开头定义函数的原因
- c - 使用 32 位整数计算 64 位无符号整数乘法和减法
- jenkins - Jenkins Pipeline 从 ansiColor 插件记录大括号?
- c# - 在 Golang 中使用 .net C# DLL?
- java - 如何在 jersey restfull 应用程序中集成石英调度程序
- python - VSCode中的Python路径:系统找不到指定的路径
- haskell - 使用 foldl 时无法构造无限类型
- matlab - 读取 .dat 文件的代码给出索引错误
- list - 使用函数将列表拆分为较小的列表