java - RecyclerView scrollToPosition() 将项目放在底部。我怎样才能把它带到TOP?
问题描述
我有一个RecyclerView
显示字符串的垂直列表:
Row0
Row1
Row2
Row3
Row4
...
我正在使用该功能recyclerView.scrollToPosition(position);
跳转到一行。但是,我想跳转到的行最终位于视图的底部!
例如,如果我这样做,recyclerView.scrollToPosition(17);
我会得到:
Row13
Row14
Row15
Row16
Row17 <--- 17 is at bottom (last visible row)
我想要的是:
Row17 <-- 17 to be on top (first visible row)
Row18
Row19
Row20
Row21
我怎样才能做到这一点?
解决方案
的默认行为.scrollToPosition()
是在您滚动到的行出现在屏幕上时停止滚动。您可以使用scrollToPositionWithOffset()
固定的偏移量,以便它总计为滚动值。
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
if (layoutManager != null) {
layoutManager.scrollToPositionWithOffset(position, 20);
}
更新
如何计算偏移值?我的 RecyclerView 中的每一行都有不同的高度。我也不知道如何测量它。
现在您可以计算屏幕上第一个和最后一个可见项目之间的差异,并且仅当屏幕上的最后一个可见项目是您想要首先推送到的当前项目时才有效。
layoutManager.scrollToPosition(position));
int firstItemPosition = ((LinearLayoutManager) recyclerview.getLayoutManager())
.findFirstCompletelyVisibleItemPosition();
int lastItemPosition = ((LinearLayoutManager) recyclerview.getLayoutManager())
.findLastCompletelyVisibleItemPosition();
layoutManager.scrollToPositionWithOffset(position,
Math.abs(lastItemPosition - firstItemPosition));
推荐阅读
- python - 如何仅将引号添加到感兴趣的子字符串?
- opencv - Haartraining 错误“参数之一的值超出范围(cvAlloc 函数的负值或太大的参数)”
- javascript - UserModel 不可分配给 Document | 类型的参数 nulll [带有 Typescript 的猫鼬]
- xamarin.forms - 进度条未出现在指定位置
- python - 如何加快距离矩阵计算?
- java - java.lang.IllegalStateException:未注册检测!必须在注册仪器下运行
- java - 从数据库中获取 NULL 值
- android - 无法解析 Android Studio 中的依赖项
- sql - 如何编写一个函数来获取oracle中一行的当前生效日期
- python - 具有不确定数量的进程的多处理