滚动Android RecyclerView并控制屏幕上的确切位置

问题描述 投票:0回答:1

我正在寻找一种以编程方式缓慢地滚动RecyclerView以便将某个元素targetPosition恰好放在屏幕中间的方法。请注意,我在RecylerView中的所有项目在设计上都具有相同的高度。 RecyclerView是垂直的。我正在用Kotlin和AndroidX编程

我尝试过:

smoothScrollToPosition(targetPosition)

它会缓慢滚动(我也可以通过扩展LinearLayoutManager并覆盖calculateSpeedPerPixel()来控制速度-参见How can i control the scrolling speed of recyclerView.smoothScrollToPosition(position)),但是滚动后我无法控制列表项在屏幕上的确切位置。我所知道的是它将在屏幕上完全可见。

我尝试过:

scrollToX(0, targetPosition * itemHeight - screenHeight / 2)

它给我错误消息:“ W / RecyclerView:RecyclerView不支持滚动到绝对位置。请使用scrollToPosition”

[我也尝试过用LinearLayoutManager替换RecyclerView,该对象包含所有项作为子项,并在视图中转换LinearLayoutManager,但最初没有让子项在屏幕之外进行绘制。

是否有解决此问题的方法?

android kotlin android-recyclerview scroll androidx
1个回答
0
投票

您可以根据实际目标位置和可见项目的数量来计算smoothScrollToPosition的targetPosition。

关于此操作的快速POC:

  val scrollToPosition = 50

  val layoutManager = recyclerView.layoutManager as LinearLayoutManager
  val firstPosition = layoutManager.findFirstVisibleItemPosition()
  val lastPosition = layoutManager.findLastVisibleItemPosition()
  val visibleItems =  lastPosition - firstPosition + 1

  if (firstPosition < scrollToPosition) {
      recyclerView.smoothScrollToPosition(scrollToPosition + (visibleItems / 2))
  } else {
      recyclerView.smoothScrollToPosition(scrollToPosition - (visibleItems / 2))
  }
© www.soinside.com 2019 - 2024. All rights reserved.