Привязка данных LiveData к CustomView - PullRequest
       51

Привязка данных LiveData к CustomView

0 голосов
/ 08 сентября 2018

У меня есть ViewModel со списком auf MutableLiveData<Data> в моем макете фрагмента. Я установил переменную данных моего CustomView с одним из элементов данных из списка.

Это прекрасно работает при первой загрузке, но не обновляется при изменении значения в моем объекте данных.

Не совсем уверен, как это сделать, до сих пор я просто использовал двустороннее связывание данных, например, с EditText и MutableLiveData.

Макет CustomView:

<data>
    <variable
        name="data"
        type="androidx.lifecycle.LiveData<Data>"/>
</data>

<androidx.cardview.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:cardBackgroundColor="@{data.color}"
            app:cardCornerRadius="16dp">

Класс:

var data: MutableLiveData<Data>? = null
    set(value) {
        binding.data = value
    }

Макет фрагмента:

<data>
    <variable
        name="viewModel"
        type=".ViewModel" />
</data>

<CustomView
        .
        .
        .
        app:data="@{viewModel.data[1]}" />

1 Ответ

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

Причина, по которой обновление происходит только при первой загрузке экрана, заключается в том, что XML используется для раздувания просмотра, а затем используется исходный элемент и устанавливается в CustomView.
Затем, когда элемент в списке обновляется, он не запускает обновление в CustomView.

Возможно, вы ищете @BindingAdapter

@BindingAdapter("enableButton")
internal fun Button.enableButton(enabled: Boolean?) = enabled?.let { isEnabled = it } ?: also { isEnabled = false }

И затем использовать его следующим образом:

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button Text"
    app:enableButton="@{viewModel.observeStatus()}" /> // <- Observes Boolean

Хорошее прохождение может быть по следующей ссылке: BindingAdapter


Примечание. Этот пример предназначен только для логического наблюдения, но его можно просто изменить, чтобы он соответствовал объекту наблюдения.

...