RecyclerView.SmoothScroller初次使用时不流畅

时间:2019-07-17 11:49:53

标签: android android-layout android-recyclerview gridlayoutmanager linearlayoutmanager

我正在尝试将我的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的滚动速度都被计算为相同

0 个答案:

没有答案