gpt4 book ai didi

android - 在 fragment 和 Activity 之间更新 ViewModel

转载 作者:行者123 更新时间:2023-11-29 00:52:30 25 4
gpt4 key购买 nike

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

  • fragment 是 ViewModelLiveData 的观察者(来自 Room 请求)
  • 这个 fragment 在某个时候开始一个 Activity
  • Activity 需要使用相同的数据(如 fragment 中的LiveData)并更新它
  • 然后用户返回 fragment

我尝试使用相同的 ViewModel 类并添加 fragment 和 Activity 作为观察者,我认为从 Activity 中更新以某种方式返回时会影响 fragment ,但它不起作用。这两个 ViewModel 似乎是独立的。

从 Activity 返回时如何强制刷新 fragment 数据(例如在onActivityResult中)?或者是否可以在 fragment 和 Activity 之间共享相同的 ViewModel? (虽然我对此表示怀疑,因为 ViewModel 链接到观察者的生命周期)

fragment

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

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
}

最佳答案

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

内部 fragment :

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

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

关于android - 在 fragment 和 Activity 之间更新 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57923215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com