我正在寻找一种以编程方式缓慢地滚动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,但最初没有让子项在屏幕之外进行绘制。
是否有解决此问题的方法?
您可以根据实际目标位置和可见项目的数量来计算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))
}