如何使用LinearSnapHelper以编程方式捕捉到Recycler视图上的位置

Sia*_*ash 10 android

我已经使用LinearSnapHelper实现了一个水平的recyclelerView,以实现选择特定配置的UI输入.有点像旧学号码选择器/选择器或旋转器.中心的项目是选定的位置.

它工作得很好,所有,但这是问题所在.在初始启动时,我需要以编程方式设置回收器视图的位置,以便所选项(其索引从磁盘加载)位于中心位置.

.scrollToPosition() 不会工作,因为它将所选项目放在开头.

现在我知道我可以做所有的数学运算并计算x坐标并手动设置它,但这就是很多冗余的工作,因为LinearSnapHelper已经这样做了,我觉得应该有一种方法来重用那个逻辑,但是实际上发起了一场狂欢.

我需要类似的东西 LinearSnapHelper.snapToPosition()

小智 11

更一般的解决方案

  1. 首先滚动RecyclerView以使目标项可见.
  2. 然后,获取目标视图的对象并使用SnapHelper确定最终捕捉的距离.
  3. 最后滚动到目标位置.

代码段:

mRecyclerView.scrollToPosition(selectedPosition);
mRecyclerView.post(() -> {
        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.scrollBy(snapDistance[0], snapDistance[1]);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)


小智 7

尝试在 RecyclerView 对象上调用 smoothScrollToPosition,并传递位置索引 (int)

mRecyclerView.smoothScrollToPosition(position);
Run Code Online (Sandbox Code Playgroud)

使用 LinearLayoutManager 和 LinearSnapHelper 为我工作。它为初始滚动设置动画,但至少将项目固定到位。

这是我在堆栈上的第一篇文章,希望它有所帮助:)