android - 存储后如何从片段中的视图模型中重复调用数据?
问题描述
我是 android 中 mvvm 架构的新手。我正在将数据从 Fragment A 传递到 B 。我想将该数据存储在 Frag B 的视图模型中并根据需要使用。据我了解,我需要在视图模型中定义两个这样的方法
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
并在片段中观察它
model.getSelected().observe(getViewLifecycleOwner(), { item ->
// Update the UI.
});
这很好,因为最初在 oncreate 中调用了 setitem 并且我正在获取数据。但是如果我在不同的时间片段中因为几个不同的原因重复需要这个Item数据,并且这个数据不会改变,那么如何使用该方法
getSelected()
因为我只使用了一次观察者,并且需要调用诸如 getdata 或 post data 之类的事件才能触发该事件。那么如何实现呢。
是不是我需要通过另一种方法多次调用 getvalue() 方法?我不确定这是否是正确的方法。请说清楚。
谢谢 :)
解决方案
该.observe
方法不仅会观察一次,而且会在每次 livedata 更改其值时触发。据我所知,调用.getValue()
获取 livedata 的值没有任何问题,但是由于您已经设置了一个观察者,您可以在那里更新您的类的 item 变量:
class MyClass{
val myItem: Item
在 onCreate 中:
model.getSelected().observe(getViewLifecycleOwner(), { item ->
// Update the UI.
myItem = item
});
编辑:要回答您的评论,您可以使用.getValue()
,它没有任何问题。根据文档:
确保 Activity 或 Fragment 具有一旦激活就可以显示的数据。一旦应用程序组件处于 STARTED 状态,它就会从它正在观察的 LiveData 对象中接收最新值。这仅在设置了要观察的 LiveData 对象时发生。
因此,当您启动组件时,onCreate
您将收到最新的项目值,只要它已设置。它不需要被改变。您将在整个组件中拥有相同的值,如果 livedata 发生更改,您的myItem
也会更新。
推荐阅读
- r - 如何将分位数结果拆分为 5 个不同的数据帧?
- javascript - 为什么我所要求的价值没有改变?
- math - 如何将 UUID 空间划分为 N 个大小相等的分区?
- javascript - 无法获得选中单选按钮的值
- sql - HiveQL 中的计数总和
- java - 使用 & 的奇怪的 Java 强制转换语法
- python - Sklearn 通过句子对文档进行矢量化以进行分类
- toad - 如何将 TOAD 布局恢复为其原始布局?
- javascript - 用于计算返回文档中唯一 ID 的 Mongo 聚合速度很慢
- javascript - 使用jQuery在模态框的按钮单击上获取表格行ID