Android: 如何通过DataBinding 绑定ProgressBar 可见性?

Android: How to bind ProgressBar visibility via DataBinding?

老实说,我已经尝试了很多,但都没有成功。

我在构造函数中有一个 HomeViewModel 和一些数据:

class HomeViewModel(
    val userName: MutableLiveData<String> = MutableLiveData(),
    val userAvatar: MutableLiveData<String> = MutableLiveData(),
    // ...
    val showProgressBarUserInfo: MutableLiveData<Boolean> = MutableLiveData()
) : BaseViewModel() {

HomeViewModel

中的函数 saveUserInfo()
private fun saveUserInfo(user: User) {
    showProgressBarUserInfo.value = true
    getSomeOtherData()
    showProgressBarUserInfo.value = false
}

其中函数getSomeOtherData()还加载了用户名和头像,也绑定了

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <import type="android.view.View" />
        <variable
            name="vm"
            type="/path/to/HomeViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ProgressBar
            // ...
            android:visibility="@{vm.showProgressBarUserInfo ? View.VISIBLE : View.GONE}" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

我还尝试创建一个函数 setVisibleOrGone()(扩展与否)

fun View.setVisibleOrGone(bool: Boolean) {
    if (bool) {
        this.visibility = View.VISIBLE
    } else {
        this.visibility = View.GONE
    }
}

使用@BindingAdapter("showOrHide") 注释并像使用它一样

showOrHide="@{vm.showProgressBarUserInfo}"

但以上都不起作用。

P.S.用户名和头像数据绑定成功,但进度条不显示。

P.S.S. 工具栏标题和 ImageView:

app:title="@{vm.userName}"
loadAvatar="@{vm.userAvatar}"

其中loadAvatar是扩展函数

请帮帮我

在我的例子中,当用户进入应用程序时,我加载了一些数据,此时进度条应该是可见的。 我也用了一个Koin,HomeViewModel是通过它分别初始化的,变量showProgressBarUserInfo的默认值为“false”。 显然,在进入saveUserInfo()函数的那一刻,getSomeOtherData()函数的调用执行得太快了,ProgressBar的状态切换是看不见的。

我通过添加

解决了我的问题
init {
    showProgressBarUserInfo.value = true
}

在我的 HomeViewModel

的顶部
android:visibility="@{vm.showProgressBarUserInfo ? View.VISIBLE : View.GONE}"