Android: Как привязать видимость ProgressBar через DataBinding? - PullRequest
0 голосов
/ 01 августа 2020

Я много пробовал, честно, но безуспешно.

У меня есть HomeViewModel и некоторые данные в конструкторе:

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

и функция saveUserInfo() в HomeViewModel

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

, но все вышеперечисленное не работает.

PS данные для имени пользователя и аватара связываются успешно, но индикатор выполнения не отображается.

PSS Заголовок панели инструментов и ImageView:

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

где loadAvatar - функция расширения

Помогите, пожалуйста

1 Ответ

0 голосов
/ 01 августа 2020

В моем случае, когда пользователь входит в приложение, я загружаю некоторые данные, и в это время должен быть виден индикатор выполнения. Я тоже использую Koin, и HomeViewModel инициализируется через него, соответственно значение по умолчанию переменной showProgressBarUserInfo - "false". Видимо, в момент входа в функцию saveUserInfo() вызов функции getSomeOtherData() производился настолько быстро, что переключение между состояниями ProgressBar было незаметным.

Я решил свою проблему добавлением

init {
    showProgressBarUserInfo.value = true
}

вверху моего HomeViewModel с

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