问题解决|[已解决]Databinding和RecycleView使用时,界面闪烁,项目状态更新混乱

问题描述 在项目中使用RecyclerView + Databinding,在使用过程中,更新某个item状态时,常常会出现屏幕闪烁1~2次后才能正常显示。
录屏后慢放查看,发现项目的次序会出现错乱:
假设原本的顺序是1~9,在更新指定item 6时,会出现类似

7 5 6

的顺序,很明显7不应该出现在5之前。
在调试时发现,如果更新项目在顶部则不会出现,如果更新的项目在屏幕下方(最后几位)则会出现,甚至如果以倒序切换(从6切换到5,同时更新5状态为选中)也会出现闪烁。
打印日志发现,在onCreateViewHolder调用时不会出现,在onBindViewHolder时会出现。
【问题解决|[已解决]Databinding和RecycleView使用时,界面闪烁,项目状态更新混乱】已经通过其他手段确定在切换的过程中,数据本身的顺序没有变化,那么只能是在绑定数据时出了问题。
查询示例发现解决方法如下:
解决方案 在viewHolderdataBinding逻辑执行完毕后,执行下面的代码:
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

    推荐阅读