如何解决Android 绑定适配器在相同的视图类型上使用相同的绑定名称但用于不同的目的
首先,我是数据绑定的新手,所以请不要因为我的(可能是愚蠢的)问题来评判我:)。我想使用相同的绑定名称,例如 app:data
到 RecyclerView
并将其绑定到提供 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}"/>
我怎样才能做到这一点?
我应该使用不同的绑定名称吗? (我之前没有使用这种方法,因为我认为它会有点混乱)
或者“正确”的方法是如何做到这一点的?
谢谢?
解决方法
我从未应用过您的解决方案。我一般会在Fragment中为ViewModel的数据创建一个观察者,传递给Adapter。
但我认为我们仍然可以解决您的问题。我不知道你是如何实现你的适配器的。我假设您的适配器是从 ListAdapter 扩展的。 因此,不是在 Binding Adapter 中初始化您的适配器,我们将在 Fragment 中初始化它并将其分配给 Recyclerview。像这样:
// onCreateView method
val adapter = RV2Adapter()
dataBinding.rcv.adapter = adapter
然后在绑定适配器中,我们将这样做:
@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()
}
}
,
您不能使用相同的绑定适配器标记,因为这两个 setData()
方法具有相同的签名/参数,因此在布局中无法决定使用哪一个。
但是您可以使用一种方法,并且在 RecyclerViews
和 id
之间有所不同
@BindingAdapter("app:data")
fun setData(recyclerView: RecyclerView,data: List<MyModel>?) {
data?.let {
if (recyclerView.id == R.id.rcv1)
recyclerView.adapter = RV1Adapter(data)
else if (recyclerView.id == R.id.rcv2)
recyclerView.adapter = RV2Adapter(data)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。