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