数据绑定:如何在一个视图中绑定不同的数据变量

Data binding: how to bind different data variables in one view

我正在使用 MVVM 设计模式以及本机数据绑定。

是否可以在数据绑定中为一个视图使用多个数据变量?

我的意思是我有 一个 xml 布局 使用 数据绑定 我想 将它用于多个 recyclerview 项目

这是一个 recyclerview 项目的第一个数据模型 class:

data class Sample1 (
    val name: String,
    val id: Int
)

这是另一个 recyclerview 项目的第二个:

data class Sample2 (
    val name: String,
    val type: String
)

这是在两个 recyclerview 中使用的 xml 代码:

<layout>

<data class="SampleDataBinding">

    <variable
        name="Sample1"
        type="model.Sample1" />

    <variable
        name="Sample2"
        type="model.Sample2" />

</data>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:padding="8dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingStart="8dp"
        android:paddingEnd="8dp"
        android:text="@{Sample1.component1()}" // this line may be different in another recyclerview item
        android:textColor="@color/black" />

</LinearLayout>

我不是指连接两个字符串。我的意思是 TextView 在第一个 recyclerview 项目和第二个项目中可能不同。

如果可以的话我该怎么做?

提前致谢

这可以通过 elvis 运算符实现,但您需要将某些东西与 select 所需值进行比较。如果只是文字的话。在适配器 class 处提供逻辑并将文本传递给数据绑定而不是许多无用的对象。如果您需要更复杂的解决方案,您需要使用不同的视图类型和 ViewHolders。 Example link

您可以使用接口实现它,您的 XML/data-binding 将使用该接口。例如,你需要一个 xml 中的标题,你可以创建一个接口 (SampleRecyclerItem),它的实现者必须提供一个 title: String.

interface SampleRecyclerItem{
    val title: String
}

data class Sample1 (
    val name: String,
    val id: Int
) : SampleRecyclerItem {
    override val title get() = name // either using a getter
}


data class Sample2 (
    val name: String,
    val type: String
) : SampleRecyclerItem {
    override val title by this::name // or using delegation (easier for vars for not providing setter and getter)
}

然后,您的XML可以直接使用此接口而不是数据类

<layout>

<data class="SampleDataBinding">

    <variable
        name="sample"
        type="model.SampleRecyclerItem" />

</data>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:padding="8dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingStart="8dp"
        android:paddingEnd="8dp"
        android:text="@{sample.title}"
        android:textColor="@color/black" />

</LinearLayout>