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

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

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

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

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

我需要像LinearSnapHelper.snapToPosition()这样的东西

更一般的解决方案

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

代码段:

 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]); } } }); 

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

 mRecyclerView.smoothScrollToPosition(position); 

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

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

我有一个recyclerView ,我在leftright添加了padding ,并在适配器中添加了虚拟视图。 这样就可以将第一个“实际”项目捕捉到。

对于初始快照,我无法使smoothScrollToPosition(0)工作。 我使用了以下内容

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

不是最好看的方式,但似乎工作!