Как выделить элемент recyclerview при использовании архитектуры MVVM и привязки данных?

#android #android-recyclerview #android-databinding #android-mvvm

#Android #android-recyclerview #android-привязка данных #android-mvvm

Вопрос:

Я пытаюсь выделить элемент recyclerview, придерживаясь принципов MVVM и используя привязку данных. Но у меня возникли проблемы с пониманием того, как обрабатывать выбор строки.

В настоящее время я передаю свой элемент recyclerview onclick в viewmodel, используя следующий интерфейс:

 public interface ItemClickListener
{
    void onItemClicked(String id);
}
  

Просмотр 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>
  

Viewmodel реализует интерфейс, поэтому у меня есть ссылка на элемент. Экземпляр прослушивателя создается в activity и передается в адаптер.

Как бы я справился с выбором элемента recyclerview (и присвоением ему цвета фона)? Должен ли viewholder реализовать OnClickListener (просмотр) и передать его через мой интерфейс вместе с его позицией?

Ответ №1:

В архитектуре MVVM ваш пользовательский интерфейс определяется данными, предоставляемыми вашей ViewModel. В вашем конкретном случае это означает, что Item то, что вы отображаете в своем ViewHolder, должно быть в состоянии определить, выбрано оно или нет. Для этого самое простое решение — добавить isSelected логическое значение в ваш Item класс. Это логическое значение позволит вам решить, что backgroundColor использовать в вашем макете.

Чтобы связать все вместе способом MVVM, ваша ItemClickListener реализация должна изменить вашу ViewModel List<Item> путем переключения isSelected логического значения элемента, на который только что щелкнули.

Если вы используете компоненты архитектуры LiveData, обязательно опубликуйте новое значение списка, которое, как я полагаю, уведомит ваш адаптер об изменении. Если вы этого не сделаете, ваш пользовательский интерфейс не будет обновляться, поскольку RecyclerView не будет знать об изменении отображаемых данных.