美文网首页
recyclerview列表默认未加载数据

recyclerview列表默认未加载数据

作者: 锅盔王子 | 来源:发表于2023-06-28 17:40 被阅读0次

1.问题原因

多布局的provider绑定数据需要执行setVariable方法

viewdatabinding绑定数据调用setVariable

调用requestRebind方法

绑定数据的主要逻辑在回调方法里面

如下,判断sdk版本是否大于19,若是,则需要判断是否添加到window上,才能执行数据的绑定逻辑

下面这个回调是当根布局没有添加到window上时增加的监听回调事件

截取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)

相关文章

网友评论

      本文标题:recyclerview列表默认未加载数据

      本文链接:https://www.haomeiwen.com/subject/wdioydtx.html