Как выделить элемент повторного просмотра при использовании архитектуры MVVM и привязки данных? - PullRequest
1 голос
/ 23 апреля 2019

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

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

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

Просмотр по клику связан с данными:

<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 реализует интерфейс, поэтому у меня есть ссылка на Item. Слушатель создается в действии и передается в адаптер.

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

1 Ответ

1 голос
/ 23 апреля 2019

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

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

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

...