我正在尝试将我的RecyclerView
平滑地滚动到列表初始化时的某个项目位置,然后将其显示在顶部。为此,我正在使用LinearSmoothScroller
。但这在首次使用时不起作用。在第一次滚动尝试时,列表仅移动到所需项目,没有任何动画。但是,当我再次从列表开始活动时,效果很好。这是我的LayoutManager中的代码:
class MyGridLayoutManager(context: Context?, spanCount: Int = 7)
: GridLayoutManager(context, spanCount) {
...
override fun smoothScrollToPosition(recyclerView: RecyclerView?, state: RecyclerView.State?, position: Int) {
val smoothScroller = object : LinearSmoothScroller(recyclerView?.context) {
override fun getVerticalSnapPreference(): Int = LinearSmoothScroller.SNAP_TO_START
override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics?): Float {
return if(displayMetrics == null) super.calculateSpeedPerPixel(displayMetrics)
else 100f / displayMetrics.densityDpi
}
}
smoothScroller.targetPosition = position
startSmoothScroll(smoothScroller)
}
}
您还可以看到,我正在此处更改滚动速度,我认为也许在第一次尝试时滚动不是即时的,但是我对速度的更改在某种程度上是行不通的,只是速度很快?无论如何,任何人都不会知道发生了什么,如何通过最初的平滑滚动来解决我的问题?
编辑:
我已经更改了呼叫smoothScrollToPosition
的方式。现在我这样做:
recyclerView.post {
recyclerView.smoothScrollToPosition(position)
}
它帮助了。现在,第一次尝试就可以看到列表正在滚动。但是它仍然比稍后的列表活动启动快得多。
另外,在调试时,我确保在所有情况下,方法calculateSpeedPerPixel
的滚动速度都被计算为相同