1.问题原因
多布局的provider绑定数据需要执行setVariable方法
viewdatabinding绑定数据调用setVariable
调用requestRebind方法
![](https://img.haomeiwen.com/i12887415/088696cc535fdac2.png)
绑定数据的主要逻辑在回调方法里面
![](https://img.haomeiwen.com/i12887415/ba66dc9858befac9.png)
如下,判断sdk版本是否大于19,若是,则需要判断是否添加到window上,才能执行数据的绑定逻辑
![](https://img.haomeiwen.com/i12887415/01b9b1c2e684846d.png)
下面这个回调是当根布局没有添加到window上时增加的监听回调事件
![](https://img.haomeiwen.com/i12887415/efa472faf2f2305a.png)
截取demo场景,viewdatabinding绑定数据时调用了super.requestRebind()方法,主要通过mFrameCallback来刷新,它的内部回调也是执行了mRebindRunnable的回调方法,此回调方法内部判断当前版本,当sdk版本大于19时,会判断根布局是否添加到window上,未添加则给根布局添加回调ROOT_REATTACHED_LISTENER,并且return,不会执行executePendingBindings方法;根布局的回调方法同样是当添加到window上时,则会再次执行mRebindRunnable的回调方法,此时跟布局已经添加到window上,会直接执行数据的绑定操作,强制刷新UI;
2.衍生问题及解决方案
按照上述分析,recyclerview添加多布局绑定item时,执行到convert时,此时根布局是未绑定到window的状态,当执行setVariable时,数据不会绑定成功,那么可以手动执行executePendingBindings来强制绑定刷新UI;
注意,此时会有另一个问题,项目中采用了view的findViewTreeLifecycleOwner方法来获取owner添加数据监听来更新UI页面,但是强制绑定时item根布局未添加到window上,同样是没有LifecycleOwner的,那么此时get到的为null,会出现真实数据无法绑定到UI上的问题;解决方案是,直接给itemview绑定一个LifecycleOwner,添加时机需要在绑定数据前,那么,可以直接在创建ViewDataBinding时绑定数据。
ViewTreeLifecycleOwner.set(holder.itemView, lifecycleOwner)
网友评论