我已经使用LinearSnapHelper实现了一个水平的recyclelerView,以实现选择特定配置的UI输入。有点像旧学号码选择器/选择器或旋转器。中心的项目是选定的位置。
它工作得很好,但这都是问题所在。在初始启动时,我需要以编程方式设置回收器视图的位置,以便所选项目(索引从磁盘加载)位于中心位置。
.scrollToPosition()
不会工作,因为它将所选项目放在开头。
现在我知道我可以完成所有数学并计算x坐标并手动设置它,但这是很多冗余的工作因为LinearSnapHelper已经这样做了,我觉得应该有一种方法来重用那个逻辑,但实际上发起了一次投掷。
我需要像LinearSnapHelper.snapToPosition()
答案 0 :(得分:8)
更一般的解决方案:
代码段:
mLayoutManager.scrollToPosition(selectedPosition);
post(new Runnable() {
@Override
public void run() {
View view = mLayoutManager.findViewByPosition(selectedPosition);
if (view == null) {
Log.e(WingPickerView.class.getSimpleName(), "Cant find target View for initial Snap");
return;
}
int[] snapDistance = mSnapHelper.calculateDistanceToFinalSnap(mLayoutManager, view);
if (snapDistance[0] != 0 || snapDistance[1] != 0) {
mRecyclerView.smoothScrollBy(snapDistance[0], snapDistance[1]);
}
}
});
答案 1 :(得分:0)
尝试在RecyclerView对象上调用smoothScrollToPosition,并传递位置索引(int)
mRecyclerView.smoothScrollToPosition(position);
使用LinearLayoutManager和LinearSnapHelper为我工作。它会为初始滚动设置动画,但至少会将项目捕捉到位。
这是我在堆栈上的第一篇文章,希望它有所帮助:)
答案 2 :(得分:-1)
我有一个recyclerView
我在padding
和left
添加了right
,并在适配器中添加了虚拟视图。这样就可以将第一个“实际”项目捕捉到。
我无法让smoothScrollToPosition(0)
在最初的快照中工作。我使用了以下
recycler.scrollBy(snapHelper.calculateDistanceToFinalSnap(binding.recycler.getLayoutManager(), recycler.getChildAt(1))[0], 0);
看起来不是最好的方式,但似乎有效!