问题描述 在项目中使用RecyclerView
+ Databinding
,在使用过程中,更新某个item状态时,常常会出现屏幕闪烁1~2次后才能正常显示。
录屏后慢放查看,发现项目的次序会出现错乱:
假设原本的顺序是1~9,在更新指定item 6
时,会出现类似
7
5
6
的顺序,很明显7不应该出现在5之前。
在调试时发现,如果更新项目在顶部则不会出现,如果更新的项目在屏幕下方(最后几位)则会出现,甚至如果以倒序切换(从6切换到5,同时更新5状态为选中)也会出现闪烁。
打印日志发现,在
onCreateViewHolder
调用时不会出现,在onBindViewHolder
时会出现。【问题解决|[已解决]Databinding和RecycleView使用时,界面闪烁,项目状态更新混乱】已经通过其他手段确定在切换的过程中,数据本身的顺序没有变化,那么只能是在绑定数据时出了问题。
查询示例发现解决方法如下:
解决方案 在
viewHolder
与dataBinding
逻辑执行完毕后,执行下面的代码:dataBinding.executePendingBindings()
原理
这会强制绑定操作马上执行,而不是推迟到下一帧刷新时。RecyclerView 会在 onBindViewHolder 之后立即测量 View。如果因为绑定推迟到下一帧绘制时导致错误的数据被绑定到 View 中, View 会被不正确地测量,因此这个 executePendingBindings() 方法非常重要!
https://juejin.im/entry/587d7361b123db4d5e7d7522
executePendingBindings
会将延迟的绑定立即执行。/**
* Evaluates the pending bindings, updating any Views that have expressions bound to
* modified variables. This must be run on the UI thread.
*/
public void executePendingBindings() {
if (mContainingBinding == null) {
executeBindingsInternal();
} else {
mContainingBinding.executePendingBindings();
}
}
参考文章 https://blog.csdn.net/io_field/article/details/80175954
https://stackoverflow.com/questions/53043412/android-why-use-executependingbindings-in-recyclerview
https://juejin.im/entry/587d7361b123db4d5e7d7522