在片段和活动之间更新ViewModel

时间:2019-09-13 11:56:47

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

我刚刚开始在应用中使用Android的体系结构组件,并且在以下情况下有一个用例:

  • 一个片段是ViewModel的{​​{1}}(来自LiveData请求的观察者)
  • 此片段在某个时候开始活动
  • 该活动需要使用相同的数据(与片段中的Room一样)并进行更新
  • 然后,用户返回到片段

我尝试使用相同的LiveData类,并以观察者的身份添加了片段和活动,以为从活动中进行更新会在返回片段时影响片段,但它不起作用。 这两个ViewModel似乎是独立的。

从活动返回时如何强制刷新片段数据(例如,在ViewModel中)? 还是可以在片段和活动之间共享相同的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);
        }
    });
}

2 个答案:

答案 0 :(得分:1)

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

内部片段:

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

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

答案 1 :(得分:0)

是的,您可以使用SharedViewModel在活动和片段之间共享ViewMode。