使用MVVM和LiveData时保存RecyclerView列表项更改的最佳做法?

时间:2019-05-22 17:01:34

标签: android android-databinding android-architecture-components android-livedata android-mvvm

我跟随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,但这听起来也不正确。

有人能指出我正确的方向吗?

1 个答案:

答案 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);
                }
            }
        }
    });

因此您可以在卡片上添加一个文本观察器,并在视图模型中调用该方法来保存它,尽管这可能会更新太多,也许有一个保存按钮