2

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

我怎样才能做到这一点?

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

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

谢谢

4

2 回答 2

2

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

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

// 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()
        }
    }
于 2021-04-23T02:44:32.907 回答
1

您不能使用相同的绑定适配器标记,因为这两种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)
    }
}

于 2021-04-23T02:51:48.367 回答