如何从Android中的视图更新视图模型

时间:2018-03-13 21:06:36

标签: android android-architecture-components android-livedata android-viewmodel

我在我的应用中使用 Android架构组件。我正在处理的用例实际上非常简单。

考虑一个简单的Todo应用程序,其中todo-detail片段正在观察来自ViewModel的实时数据,该ViewModel持有当前打开的todo-item的实例。

由于此片段处于编辑模式,因此用户可以编辑该项目的属性。

使用案例1

其中有一个带有灰色标记图标的图像按钮。当用户点击它时,该项目被标记为“高优先级”并将标志颜色更改为红色。

为了实现这一点,我将视图模型实例上的属性viewModel.value.isHighPriority更新为true,这会导致数据发生更改,从而导致片段监听它。如果viewModel.value.isHighPriority = true,片段会显示标记颜色红色。所以基本上来自视图的UI事件会回到视图,导致它更新。

使用案例2

考虑一个待办事项的标题。它显示在Android的EditText中。在这种情况下,如何使用用户在框中键入的数据更新视图模型?我当然不希望上edit编辑文本的文本更改事件并按字符处理。这似乎是对我不必要的黑客攻击。

这一切让我重新思考我处理更新的方式,以便从视图中查看模型的实时数据。如果我正在做的事情(双向数据绑定)不是一个好习惯,请建议我如何处理视图接收UI事件的情况,该事件导致视图本身正在呈现的数据更新。

1 个答案:

答案 0 :(得分:0)

如果您尝试根据用户输入的内容更新视图模型,则必须拥有文本观察器。即使没有视图模型,也没有别的办法。如果您保留了像提交这样的按钮,则可以根据onClick更新视图模型。

实际上,如果你想要ViewModel的真正本质,你需要将它与Databinding一起使用。然后,您可以直接从布局中调用视图模型的方法,而不需要知道大部分活动或片段!

例如,在您的情况下,您可以在布局中调用视图模型中的方法onPressed(Item item),然后您可以将可观察的优先级值设置为Priority.HIGH。布局会自动更改。视图不需要知道这一点。

即使您不使用数据绑定,在第一种情况下考虑是否必须按下按钮进行api调用,并且在成功时您必须更新视图。没有视图模型会不会很麻烦?