数据绑定:如何在一个视图中绑定不同的数据变量
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 处提供逻辑并将文本传递给数据绑定而不是许多无用的对象。如果您需要更复杂的解决方案,您需要使用不同的视图类型和 ViewHolder
s。 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>
我正在使用 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 处提供逻辑并将文本传递给数据绑定而不是许多无用的对象。如果您需要更复杂的解决方案,您需要使用不同的视图类型和 ViewHolder
s。 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>