gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:14 28 4
gpt4 key购买 nike

我正在使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com