数据绑定在等待 Android 中填充值时显示未填充的值

问题描述 投票:0回答:1

我正在使用数据绑定使用三元语法在 TextView 上显示文本。

android:text="@{vm.value.firstValue != null ? vm.value.firstValue.toString() : @string/source1}"

此代码在

@string/source1
通过网络调用完全加载之前首次加载片段时显示
vm.value
。然后,当网络调用成功时,会显示
vm.value.firstValue
。但是,我想仅在网络调用失败时才显示
@string/source1

我想知道在等待网络调用成功完成时是否可以不显示任何内容(保持为空)。然后,根据网络调用是否成功填充 TextView。如果这听起来不错,我想知道如何使用数据绑定来实现这一点。

android android-databinding
1个回答
0
投票

数据绑定框架无法区分由于加载尚未完成而导致的

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}"
© www.soinside.com 2019 - 2024. All rights reserved.