我跟随this guide来了解当数据库中发生更改时如何使用LiveData
和数据绑定来更新UI,并在我对应用程序进行更改时将数据保存回数据库中。
我缺少的部分是如何使用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
的{{1}}应该负责与我的LiveData<List<Model>> models
通信以执行数据库操作。
我知道我可以将Repository
作为变量ViewModel
添加到列表项<layout/>
,并在<layout/>
上添加listItemTextChanged(Model model)
方法然后更新数据库中的ViewModel
,但这听起来也不正确。
有人能指出我正确的方向吗?
答案 0 :(得分:1)
我不使用数据绑定,但是您很正确,只有视图模型应该与存储库进行通信,但是如果您使用实时数据,那么您需要在片段/活动中对其进行观察,并且应该更新回收者视图
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);
}
}
}
});
因此您可以在卡片上添加一个文本观察器,并在视图模型中调用该方法来保存它,尽管这可能会更新太多,也许有一个保存按钮