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

Databinding displays unpopulated value while waiting for the value to be populated in Android

提问人:foseja 提问时间:10/23/2023 最后编辑:foseja 更新时间:10/23/2023 访问量:33

问:

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

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

此代码在首次加载片段时显示,然后通过网络调用完全加载。然后,当网络调用成功时显示它。但是,我只想在网络调用失败时显示。
我想知道在等待网络调用成功完成时是否可以不显示任何内容(将其保留为空)。然后,根据网络调用是否成功填充 TextView。如果这听起来没问题,我想知道如何使用数据绑定来实现这一点。
@string/source1vm.valuevm.value.firstValue@string/source1

android-databinding

评论


答:

2赞 BenjyTec 10/23/2023 #1

数据绑定框架无法区分由加载尚未完成导致的值与加载后的结果值。因此,您必须自己实现这样的辨别逻辑。nullnull

您可以在 ViewModel 中引入一个新的布尔值。每当触发加载操作时,请设置 ,并在加载完成后设置 。然后在 XML 中使用以下条件:isLoadingisLoading=trueisLoading=false

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}"