【问题标题】:Update ViewModel between a fragment and an activity在片段和活动之间更新 ViewModel
【发布时间】:2019-09-13 11:56:47
【问题描述】:

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

  • 片段是ViewModelLiveData 的观察者(来自Room 请求)
  • 此片段在某个时间点开始一个活动
  • 活动需要使用相同的数据(如片段中的LiveData)并更新它
  • 然后用户返回到片段

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

从 Activity 返回时如何强制刷新片段数据(例如在 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
}

【问题讨论】:

  • 生命周期对于每个活动或新生来说都是独立的,因此您的两个 ViewModel 将是完全不同的生命周期,我建议您在启动片段时将数据发送到 Intent 并在您完成后将其推回完成(如果您没有从片段内部保存它,否则您可以再次调用房间数据库)
  • 如果 Activity 和 Fragment 都使用相同的 ViewModel 实例,您所描述的应该可以工作。为此,我使用 Koin 进行依赖注入。
  • 请也发布 ViewModel 类
  • 你可以查看这个答案:stackoverflow.com/questions/44641121/…
  • 发布你的viewModel类

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


【解决方案1】:

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

内部片段:

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

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

【讨论】:

    【解决方案2】:

    是的,您可以使用 SharedViewModel 在 Activity 和 Fragment 之间共享 ViewMode。

    猜你喜欢
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多