我正在使用数据绑定使用三元语法在 TextView 上显示文本。
android:text="@{vm.value.firstValue != null ? vm.value.firstValue.toString() : @string/source1}"
此代码在
@string/source1
通过网络调用完全加载之前首次加载片段时显示 vm.value
。然后,当网络调用成功时,会显示vm.value.firstValue
。但是,我想仅在网络调用失败时才显示@string/source1
。数据绑定框架无法区分由于加载尚未完成而导致的
null
值和加载后的结果 null
值。所以你必须自己实现这样的辨别逻辑。
您可以在 ViewModel 中引入一个新的
isLoading
布尔值。每当触发加载操作时,设置isLoading=true
,加载完成后,设置isLoading=false
。然后在 XML 中使用以下条件:
android:text="@{vm.isLoading ? (@string/textIsLoading) : (vm.value.firstValue != null ? vm.value.firstValue.toString() : @string/source1)}"
您可能可以像这样进一步简化上面的语句:
android:text="@{vm.isLoading ? (@string/textIsLoading) : (vm.value.firstValue ?? @string/source1)}"
有关
??
运算符的说明,请参阅 此 StackOverflow 问题。
如果您不想在 ViewModel 中创建新的布尔变量,您还可以将
value.firstValue
变量初始化为加载时显示的默认字符串:
value.firstValue = "Text is loading..." // replace with R.string later
当加载文本失败时,只需设置
value.firstValue = null
然后在 XML 中使用以下语句:
android:text="@{vm.value.firstValue ?? @string/source1}"