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

问题描述

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

7
5
6

的顺序,很明显7不应该出现在5之前。

在调试时发现,如果更新项目在顶部则不会出现,如果更新的项目在屏幕下方(最后几位)则会出现,甚至如果以倒序切换(从6切换到5,同时更新5状态为选中)也会出现闪烁。

打印日志发现,在onCreateViewHolder调用时不会出现,在onBindViewHolder时会出现。

已经通过其他手段确定在切换的过程中,数据本身的顺序没有变化,那么只能是在绑定数据时出了问题

查询示例发现解决方法如下:

解决方案

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

你可能感兴趣的:(问题解决,android)