如何使用LinearSnapHelper

时间:2017-03-23 22:18:50

标签: android

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

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

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

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

我需要像LinearSnapHelper.snapToPosition()

这样的东西

3 个答案:

答案 0 :(得分:8)

更一般的解决方案:

  1. 首先滚动RecyclerView以使目标项可见。
  2. 然后,取目标View的对象并使用SnapHelper来确定 最后拍摄的距离。
  3. 最后滚动到目标位置。
  4. 代码段:

    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我在paddingleft添加了right,并在适配器中添加了虚拟视图。这样就可以将第一个“实际”项目捕捉到。

我无法让smoothScrollToPosition(0)在最初的快照中工作。我使用了以下

recycler.scrollBy(snapHelper.calculateDistanceToFinalSnap(binding.recycler.getLayoutManager(), recycler.getChildAt(1))[0], 0);

看起来不是最好的方式,但似乎有效!