android databinding 数据驱动视图不更新?
在这个问题中,作者使用 viewmodel 和 livedata 来管理 ui 数据。viewmodel 中的 level livedata 属性通过 @{vm.gettext()} 绑定到 textview 的文本。当更新 level 时,vm 中定义的 gettext() 方法会根据其值返回相应的文本。然而,用户界面并未反映这些更新。
问题原因:
未能为 viewmodel 设置生命周期所有者是导致此问题的关键原因。viewmodel 需要知道视图的生命周期阶段,以便在视图销毁或轮换时自动取消 livedata 观察者。如果没有设置生命周期所有者,则 livedata 永远不会被观察,因此视图也不会收到任何更新。
解决方案:
要在 xml 视图中设置生命周期所有者,请使用 android:lifecycleowner 属性。例如:
<textview // ... android:text='@{vm.gettext()}' android:lifecycleowner='@global_activity' />
或者,您可以在 activity 或 fragment 中通过调用 binding.setlifecycleowner(this) 来设置所有者:
// 在 Activity 中 binding.setLifecycleOwner(this) // 在 Fragment 中 binding.setLifecycleOwner(viewLifecycleOwner)
通过设置生命周期所有者,viewmodel 可以正确检测视图的生命周期变化,并相应地取消 livedata 观察者。这将确保在更新 level 时,ui 会立即反映这些变化。