首页 > 解决方案 > 在片段和活动之间更新 ViewModel

问题描述

我刚开始在我的应用程序中使用 Android 的架构组件,我有一个用例:

我尝试使用相同的ViewModel类并将片段和活动添加为观察者,认为从活动更新会在返回到片段时影响片段,但它不起作用。这两个ViewModels似乎是独立的。

从活动返回时如何强制刷新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
}

标签: androidviewmodelandroid-roomandroid-architecture-componentsandroid-livedata

解决方案


通过为视图模型设置一个通用的生命周期所有者,并在不同的片段上使用相同的视图模型,我设法获得了您想要的结果。在我的片段中,我得到这样的视图模型:

内部片段:

 var userViewModel = activity?.run{ViewModelProviders.of(this, SharedUserViewModel.MainActivityViewModelFactory(applicationContext))[SharedUserViewModel::class.java]}

您是否看到我将活动用作“ViewModelProviders.of”参数?这样,视图模型具有相同的所有者,它对我来说工作正常。


推荐阅读