Я следовал этому руководству , чтобы понять, как использовать 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
в базе данных, но это тоже не звучит правильно.
Может ли кто-нибудь указать мне правильное направление?