【问题标题】:Databind LiveData to CustomView将 LiveData 数据绑定到 CustomView
【发布时间】:2018-09-08 18:41:09
【问题描述】:

我的片段布局中有一个带有列表 auf MutableLiveData<Data> 的 ViewModel 我使用列表中的数据元素之一设置了我的 CustomView 的数据变量。

它在第一次加载时工作正常,但当我更改数据对象中的值时它不会更新。

不太清楚如何做到这一点,直到现在我只是使用了 EditText 和 MutableLiveData 的双向数据绑定。

自定义视图布局:

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

【问题讨论】:

    标签: android kotlin android-databinding android-livedata android-viewmodel


    【解决方案1】:

    仅在第一次加载屏幕时发生更新的原因是 XML 用于膨胀 View,然后使用初始项并将其设置为 CustomView。
    那么当列表中的item更新时,不会触发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


    注意:该示例仅用于布尔观察,但可以简单地更改它以匹配观察到的任何对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      • 2019-08-02
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多