我在回收器视图中处理某些动画时遇到问题。我在onViewAttachedToWindow中做了相关测量:
override fun onViewAttachedToWindow(holder: PairingViewHolder) {
super.onViewAttachedToWindow(holder)
// get originalHeight & expandedHeight if not gotten before
if (holder.expandedHeight < 0) {
// Execute pending bindings, otherwise the measurement will be wrong.
holder.itemViewDataBinding.executePendingBindings()
holder.cardContainer.layoutParams.width = expandedWidth
holder.expandedHeight = 0 // so that this block is only called once
holder.cardContainer.doOnLayout { view ->
holder.originalHeight = view.height
holder.expandView.isVisible = true
// show expandView and record expandedHeight in next layout pass
// (doOnPreDraw) and hide it immediately.
view.doOnPreDraw {
holder.expandedHeight = view.height
holder.expandView.isVisible = false
holder.cardContainer.layoutParams.width = originalWidth
}
}
}
}
问题是 doOnPreDraw 仅为某些视图而被调用。我猜这与视图的可见性有关,因为项目(展开)越小,调用 onPreDraw 的项目数就越高。
我的猜测是,由于我在 onLayout 中展开它们,因此 recyclerView 认为仅那些展开时在屏幕上实际可见的部分可见。在 onPreDraw 中,我折叠了它们,导致一些视图能够正确设置动画,而另一些则不能。
你会如何解决这个问题?
提前致谢。
我也遇到了同样的问题,并解决了。
发生了什么: 只有在回收器视图上最初不可见的第一个项目对我来说确实受到影响,所有其他项目的行为都按预期进行。
是什么原因造成的:
doOnPreDraw
使用 OneShotPreDrawListener
,并且仅当调用 onPreDraw
或调用 onViewDetachedFromWindow
时才会分离。doOnDetach
的文档作为参考。
当该视图与窗口分离时执行给定的操作。 如果视图未附加到窗口,则操作将立即执行,否则操作将在视图与当前窗口分离后执行。
在回收器视图上,我们最初创建与窗口分离的视图,这意味着
onViewDetachedFromWindow
将立即被调用。onPreDraw
也被立即调用。onPreDraw
侦听器将在运行之前被删除。
免责声明: 我尝试了多种更简单的不同解决方案,但我总是遇到一些边缘情况,因此唯一似乎可以正常工作的解决方案如下。 (但如果有人找到更简单的,我会很高兴)。
解决方案: 我复制了整个
OneShotPreDrawListener
并从 removeListener
方法中删除了 onViewDetachedFromWindow
。