提问人:foseja 提问时间:10/23/2023 最后编辑:foseja 更新时间:10/23/2023 访问量:33
数据绑定在等待 Android 中填充值时显示未填充的值
Databinding displays unpopulated value while waiting for the value to be populated in Android
问:
我正在使用数据绑定使用三元语法在 TextView 上显示文本。
android:text="@{vm.value.firstValue != null ? vm.value.firstValue.toString() : @string/source1}"
此代码在首次加载片段时显示,然后通过网络调用完全加载。然后,当网络调用成功时显示它。但是,我只想在网络调用失败时显示。
我想知道在等待网络调用成功完成时是否可以不显示任何内容(将其保留为空)。然后,根据网络调用是否成功填充 TextView。如果这听起来没问题,我想知道如何使用数据绑定来实现这一点。@string/source1
vm.value
vm.value.firstValue
@string/source1
答:
2赞
BenjyTec
10/23/2023
#1
数据绑定框架无法区分由加载尚未完成导致的值与加载后的结果值。因此,您必须自己实现这样的辨别逻辑。null
null
您可以在 ViewModel 中引入一个新的布尔值。每当触发加载操作时,请设置 ,并在加载完成后设置 。然后在 XML 中使用以下条件:isLoading
isLoading=true
isLoading=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}"
评论