android - 在片段和活动之间更新 ViewModel
问题描述
我刚开始在我的应用程序中使用 Android 的架构组件,我有一个用例:
- 片段是
ViewModel
's的观察者LiveData
(来自Room
请求) - 这个片段在某个时间点开始一个活动
- 活动需要使用相同的数据(如
LiveData
在片段中)并更新它 - 然后用户返回到片段
我尝试使用相同的ViewModel
类并将片段和活动添加为观察者,认为从活动更新会在返回到片段时影响片段,但它不起作用。这两个ViewModel
s似乎是独立的。
从活动返回时如何强制刷新onActivityResult
片段数据(例如)?或者是否可以ViewModel
在片段和活动之间共享相同的内容?(尽管我对此表示怀疑,因为它ViewModel
与观察者的生命周期有关)
分段
public void onAttach(@NonNull Context context) {
...
mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
mViewModel.getData().observe(this, new Observer<List<Data>>() {
@Override
public void onChanged(List<Data> data) {
mAdapter.setData(data);
}
});
}
// in an onClick method
startActivity(intent); // go to the Activity
活动
protected void onCreate(Bundle savedInstanceState) {
...
mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
mViewModel.getData().observe(this, new Observer<List<Data>>() {
@Override
public void onChanged(List<Data> data) {
mPagerAdapter.setData(data);
}
});
}
任何帮助将不胜感激!
编辑:
查看模型
public class MyViewModel extends AndroidViewModel {
private Dao dao;
private ExecutorService executorService;
public MyViewModel (@NonNull Application application) {
super(application);
dao = AppDatabase.getInstance(application).getDao();
executorService = Executors.newSingleThreadExecutor();
}
public LiveData<Data> getData() {
return dao.getAllData();
}
// other methods to update and delete with executorService
}
解决方案
通过为视图模型设置一个通用的生命周期所有者,并在不同的片段上使用相同的视图模型,我设法获得了您想要的结果。在我的片段中,我得到这样的视图模型:
内部片段:
var userViewModel = activity?.run{ViewModelProviders.of(this, SharedUserViewModel.MainActivityViewModelFactory(applicationContext))[SharedUserViewModel::class.java]}
您是否看到我将活动用作“ViewModelProviders.of”参数?这样,视图模型具有相同的所有者,它对我来说工作正常。
推荐阅读
- c# - 有没有办法使用反射获取继承的泛型类的类型?
- android - 建议更改 build.gradle 文件后,背景可绘制对象导致膨胀异常
- tensorflow - TensorFlow 在执行推理时如何分配 GPU 内存?
- google-sheets - 从 Google 表格数据透视表中删除零行
- java - Spring Tool Suite 4 中的“找不到 java.lang.Object 的类文件”
- python - 如何使用 Python 求解 4 x 4 数组,其中 16 个未知数(更新)
- excel - 如何在sheet2中的标题行之后自动启动所有数据插入
- python - NN实现-反向传播后更新尺寸改变
- common-lisp - SBCL ASDF 问题与 CCL Re:循环参考?
- ios - App Store Connect TestFlight 显示没有构建