使用MVVM架构和数据绑定时如何突出显示recyclerview项目?

use*_*779 5 android android-recyclerview android-databinding android-mvvm

我试图在遵守 MVVM 原则并使用数据绑定的同时突出显示 recyclerview 项目。但我无法理解如何处理选择行。

我目前使用以下接口将我的 recyclerview 项目 onclick 传递到视图模型:

public interface ItemClickListener
{
    void onItemClicked(String id);
}
Run Code Online (Sandbox Code Playgroud)

onclick 视图是数据绑定的:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
            name="model"
            type="Item" />

        <variable
            name="listener"
            type="ItemClickListener" />
    </data>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{model.name}"
        android:onClick="@{() -> listener.onItemClicked(model.name)}" />
</layout>
Run Code Online (Sandbox Code Playgroud)

视图模型实现了该接口,因此我可以引用该项目。侦听器在活动中实例化并传递到适配器中。

我将如何处理选择 recyclerview 项目(并为其指定背景颜色)?viewholder 是否应该实现 onClickListener(View view) 并将其及其位置通过我的界面传递?

Jul*_*zul 3

在 MVVM 架构中,您的 UI 由 ViewModel 公开的数据驱动。在您的特定情况下,这意味着Item您在 ViewHolder 中显示的 应该能够判断它是否被选中。为此,最简单的解决方案是isSelected向您的Item类添加一个布尔值。该布尔值将允许您决定backgroundColor在布局中使用哪个。

要以 MVVM 方式将所有内容链接在一起,您的实现应该通过切换刚刚单击的 Item 的布尔值来ItemClickListener修改 ViewModel 。List<Item>isSelected

如果您正在使用体系结构组件 LiveData,请确保发布列表的新值,我认为这会通知您的适配器发生了更改。如果您不这样做,您的 UI 将不会刷新,因为 RecyclerView 将不会意识到正在显示的数据的更改。