Привязка данных: настройка видимости с помощью переменной LiveData при клике - PullRequest
0 голосов
/ 25 января 2019

Я хочу настроить видимость ProgressBar в зависимости от переменной MutableLiveData в моей модели представления.Я узнал, что MutableLiveData не работает, поэтому мне нужна переменная LiveData для его преобразования. Довольно странно, но, по крайней мере, это должно сработать, верно?

Ну, на данный момент это не работает.И я не понимаю, почему я хочу, чтобы две переменные делали одну вещь.

Я надеюсь, что код говорит сам за себя:

Активность:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val binding: ActivityLoginBinding = DataBindingUtil.setContentView(this, R.layout.activity_login)
    binding.lifecycleOwner = this
    binding.viewmodel = vm
}

Просмотр модели:

class LoginViewModel : ViewModel() {
    var isLoading: MutableLiveData<Boolean> = MutableLiveData(false)
    var showLoadingIndicator: LiveData<Boolean> = Transformations.map(isLoading) { isLoading.value }

    fun login() {
        Timber.d("login")
        isLoading.value = true
    }
}

Макет:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <variable
                name="viewmodel"
                type="mypackage.LoginViewModel"/>
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout>

        <com.google.android.material.button.MaterialButton        
                android:onClick="@{() -> viewmodel.login()}"/>

        <include
                layout="@layout/loading_indicator"
                app:goneUnless="@{viewmodel.showLoadingIndicator}"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

BindingAdapter:

@Suppress("unused")
object BindingAdapters {
    @BindingAdapter("goneUnless")
    @JvmStatic
    fun goneUnless(view: View, visible: Boolean) {
        view.visibility = if (visible) View.VISIBLE else View.GONE
    }
}

Когда я нажимаю кнопку, вызов Timber работает, но видимость индикатора загрузкине меняется (из ушедшего в видимое).Как я могу это исправить и, возможно, избавиться от двух переменных и иметь только одну?

Спасибо.

1 Ответ

0 голосов
/ 25 января 2019

Вам на самом деле не нужно BindingAdapter, есть более простой способ выполнить то, что вы хотите.

1) ViewModel: измените поле загрузки на: val isLoading = ObservableBoolean()

2) Добавьте импорт в тег <data> вашего макета: <import type="android.view.View"/>

3) Ваше включение станет:

<include
   layout="@layout/loading_indicator"
   android:visibility="@{viewmodel.isLoading ? View.VISIBLE : View.GONE}"/>

Используйте set(value), чтобы изменить значение ObservableBoolean

...