android - RecyclerView LinearLayoutManager computeVerticalScrollOffset() 没有返回正确的值

标签 android android-recyclerview

我正在使用 RecyclerView 和相应的 LinearLayoutManager。我在我的应用程序的一部分中添加了一些自定义滚动功能,我将在其中翻译自定义 header 对象以及根据此项目建模的 RecyclerView 的滚动:https://github.com/boxme/ParallaxHeaderViewPager (它使用 ListView 而不是 RecyclerView)。

不过我遇到了一个奇怪的问题。它可以很好地滚动一段时间,但随后会跳动几百个像素。我添加了日志语句来查看 LinearLayoutManager.computeVerticalScrollOffset() 计算的偏移量,因为我确实滚动了,偏移量从 320 左右随机跳到 1200,然后它将继续从该点开始适本地计算偏移量。

请参阅下面的回答,了解我是如何解决这个问题的!

最佳答案

多亏了这个线程终于找到了一种准确解决这个问题的方法,在覆盖的 LinearLayoutManager 的代码下面发布,抱歉它的 kotlin :(,你也可以在 more detail here 中阅读相关内容

class LinearLayoutManagerWithAccurateOffset(context: Context?) : LinearLayoutManager(context) {

    // map of child adapter position to its height.
    private val childSizesMap = mutableMapOf<Int, Int>()

    override fun onLayoutCompleted(state: RecyclerView.State?) {
        super.onLayoutCompleted(state)
        for (i in 0 until childCount) {
            val child = getChildAt(i)
            childSizesMap[getPosition(child)] = child.height
        }
    }

    override fun computeVerticalScrollOffset(state: RecyclerView.State?): Int {
        if (childCount == 0) {
            return 0
        }
        val firstChildPosition = findFirstVisibleItemPosition()
        val firstChild = findViewByPosition(firstChildPosition)
        var scrolledY: Int = -firstChild.y.toInt()
        for (i in 0 until firstChildPosition) {
            scrolledY += childSizesMap[i] ?: 0
        }
        return scrolledY
    }

}

更新

请注意,这不支持保存状态,因此在配置更改/从进程死亡中恢复时,状态将不同步并且滚动看起来很奇怪,解决此问题的方法是存储 childSizesMap 通过覆盖 onSaveInstanceState

关于android - RecyclerView LinearLayoutManager computeVerticalScrollOffset() 没有返回正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30361403/

相关文章:

java - Android 版 Tomtom map sdk 无法加载图 block

android - 在 Android Studio 1.3.1 中多次导入库项目导致库消失

android - 使用 Kotlin 将多个 OnClickListener 添加到 RecyclerView

android - 使用相同的回收器适配器来充气不同的 Activity

android - 如何使recyclerview显示所有项目并且无法滚动

android - Scrollview 内 Recyclerview 的平滑水平滚动

android - 使用蓝牙打印机从 Android 应用程序打印数据

android - takePicture 在 Android 应用程序上失败(使用 SensorEventListener 调用图片)

java - Android C/C++ native 调用 Java API

android - RecyclerView 项目背景可绘制不会将尺寸调整为内容大小