Как сохранить изменения элемента списка RecyclerView при использовании MVVM и LiveData? - PullRequest
0 голосов
/ 22 мая 2019

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

Часть, которую я пропускаю, состоит в том, как правильно расширить объяснения, описанные в руководстве, до Layout с RecyclerView. В этом случае ViewModel будет содержать член LiveData<List<Model>> models, и мне придется связать элемент списка RecyclerView с Model, добавив что-то подобное в мой элемент списка <layout/>:

<data>
    <variable name="model"
        type="com.example.models.Model" />
</data>

но все же соблюдайте коллекцию models моего ViewModel в моем Activity:

viewModel.models.observe(this, Observer { models ->
    modelsAdapter.data = models?.data
    modelsAdapter.notifyDataSetChanged()
})

Приведенный выше метод Observer не будет запущен, если свойство экземпляра Model в коллекции models изменится, поэтому если я хочу выполнить какой-либо код (например, сохранение данных в моей БД) при изменении создается пользователем в элементе списка, который привязан к моему Model, я мог бы просто добавить метод к своему классу Model и связать событие onChange для View в моем элементе списка <layout/> с этот метод. Допустим, у меня есть EditText в моем элементе списка <layout/>, тогда я мог бы добавить строки ниже, чтобы запустить метод listItemTextChanged() для границы Model, когда текст в моем EditText изменится:

<EditText
    ...
    android:text="@={model.ListItemText}"
    android:onTextChanged="@{ () -> model.listItemTextChanged()}" />

Однако это означает, что помимо добавления метода к моему Model классу, мне также нужно было бы добавить ссылку на мой Repository, если я хочу сохранить текст моего EditText в базе данных, и он чувствует как будто это не правильный способ сделать это, и что мой ViewModel, который содержит LiveData<List<Model>> models, должен отвечать за связь с моим Repository для выполнения операций с базой данных.

Я знаю, что я мог бы добавить ViewModel в качестве переменной <layout/> к своему элементу списка <layout/> и добавить метод listItemTextChanged(Model model) в моем ViewModel, который мог бы затем обновить model в базе данных, но это тоже не звучит правильно.

Может ли кто-нибудь указать мне правильное направление?

1 Ответ

1 голос
/ 22 мая 2019

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

myViewModel = ViewModelProviders.of(getActivity()).get(MyViewModel.class);
    myViewModel.getCards().observe(getViewLifecycleOwner(), new 
        Observer<List<Card>>() {
        @Override
        public void onChanged(@Nullable List<Card> cards) {
            if (cards != null && cardAdapter != null){
                    cardAdapter.refreshList(cards);
                }
            }
        }
    });

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

...