Android Recyclerview 实现自定义滑动时长的 LinearLayoutManager

207 阅读1分钟

代码如下,在 CustomScrollDurationLinearLayoutManager 的构造函数中传入自定义的滑动时长即可,滑动到指定 position 时注意要调用 smoothScrollToPosition()

import android.content.Context
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.LinearSmoothScroller
import androidx.recyclerview.widget.RecyclerView

class CustomScrollDurationLinearLayoutManager(
    private val context: Context,
    orientation: Int,
    reverseLayout: Boolean,
    private val customScrollDuration: Int = 0
) : LinearLayoutManager(context, orientation, reverseLayout) {

    override fun smoothScrollToPosition(
        recyclerView: RecyclerView?,
        state: RecyclerView.State?,
        position: Int
    ) {
        val linearSmoothScroller =
            CustomDurationSmoothScroller(context, customScrollDuration)
        linearSmoothScroller.targetPosition = position
        startSmoothScroll(linearSmoothScroller)
    }

    inner class CustomDurationSmoothScroller(
        context: Context,
        private val customScrollDuration: Int = 0
    ) : LinearSmoothScroller(context) {

        /**
         * 控制滑动时长
         */
        override fun calculateTimeForScrolling(dx: Int): Int {
            return if (customScrollDuration != 0)
                customScrollDuration
            else
                super.calculateTimeForScrolling(dx)
        }
    }
}