Android 绑定(bind)适配器在相同 View 类型上使用相同的绑定(bind)名称但用于不同的目的

标签 android kotlin android-databinding android-binding-adapter

首先,我是数据绑定(bind)的新手,所以请不要因为我的(可能是愚蠢的)问题来评判我:)。我想使用相同的绑定(bind)名称,例如 app:dataRecyclerView并将其绑定(bind)到 ViewModel提供 List<MyModel> 的字段。但是,我想对 RecyclerView 的不同实例使用不同的适配器(例如,膨胀不同的项目布局) .

// For RecyclerView 1
@BindingAdapter("app:data")
fun setData(recyclerView: RecyclerView, data: List<MyModel>?) {
    data?.let {
        recyclerView.adapter = RV1Adapter(data)
    }
}

// For RecyclerView 2
@BindingAdapter("app:data")
fun setData(recyclerView: RecyclerView, data: List<MyModel>?) {
    data?.let {
        recyclerView.adapter = RV2Adapter(data)
    }
}

例如布局

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/rcv1"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    app:data="${viewModel.data}"/>


<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/rcv2"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    app:data="${viewModel.data}"/>

我怎样才能实现这个目标?

我应该使用不同的绑定(bind)名称吗? (我以前没有使用过这种方法,因为我认为它会有点困惑)

或者“正确”的方法是如何做到这一点?

谢谢🙏

最佳答案

我从来没有应用过你的解决方案。我通常在Fragment中为ViewModel的数据创建一个观察者并将其传递给Adapter。

但我认为我们仍然可以解决您的问题。我不知道你是如何实现你的适配器的。我假设您的适配器是从 ListAdapter 扩展的。 因此,我们不会在 Binding Adapter 中初始化适配器,而是在 Fragment 中初始化它并将其分配给 Recyclerview。像这样:

// onCreateView method 
val adapter = RV2Adapter()
dataBinding.rcv.adapter = adapter 

然后在绑定(bind)适配器中,我们将这样做:

@BindingAdapter("app:data")
fun setData(recyclerView: RecyclerView, data: List<MyModel>?) {
    data?.let {
        recyclerView.adapter.submitList(data)
    }
}

如果您的适配器不是从 ListAdapter 扩展的。您可以在其中创建一个setter方法并传递数据列表。

@BindingAdapter("app:data")
    fun setData(recyclerView: RecyclerView, data: List<MyModel>?) {
        data?.let {
            recyclerView.adapter.setData(data)
            recyclerView.adapter.notifyDataChanged()
        }
    }

关于Android 绑定(bind)适配器在相同 View 类型上使用相同的绑定(bind)名称但用于不同的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67223176/

相关文章:

Android Eclipse : Sharing image to facebook without mediaStore. 插入()

generics - 为什么泛型父类(super class)型声明不允许引用子类型对象?

生成的数据绑定(bind)文件中的 Android 数据绑定(bind) : cannot find . ..BindingImpl

java - 是否可以使用 Android Studio 将 Kotlin 转换为 Java?

android - 按字母数字排序对象

android - 数据绑定(bind)到数组适配器仅适用于根文件夹中的模型

没有数据绑定(bind)的android MVVM

android - x86 Android AVD 是否可以在 Linux on AMD 上运行?

android - 在不将应用程序置于最前面的情况下启动 Activity

android - 如何部署我的 Android 项目以及如何在我的设备上进行测试