#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 не будет знать об изменении отображаемых данных.