首先,我是数据绑定(bind)的新手,所以请不要因为我的(可能是愚蠢的)问题来评判我:)。我想使用相同的绑定(bind)名称,例如 app:data
到 RecyclerView
并将其绑定(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/