结束EditItem Activity后如何指定跳转Fragment并控制LiveData更新顺序
问题根因
hide()方法仅隐藏Fragment的视图层,不会变更Fragment的生命周期状态,被隐藏的Fragment A仍处于RESUMED活跃状态,其绑定LiveData的LifecycleOwner处于活跃状态,因此ViewModel中对应的LiveData发生数据变更时,所有已注册的活跃观察者会按注册顺序接收回调,Fragment A注册时间更早,因此先触发它的更新逻辑。
方案1:仅触发Fragment B自动更新(匹配你后续手动更新Fragment A的需求)
不需要移除Fragment A,仅在Fragment A的更新逻辑中增加可见性判断即可:
- 给Fragment A增加可见性标记成员变量
private boolean isFragmentVisible = true;
- 重写
onHiddenChanged方法同步可见状态
@Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); isFragmentVisible = !hidden; }
- 修改LiveData回调逻辑,隐藏状态下跳过更新
item_viewmodel.getAllCategoryModel().observe(getViewLifecycleOwner(), new Observer<List<Items>>() { @Override public void onChanged(List<Items> myLists) { if (!isFragmentVisible) { return; } // 原有列表更新逻辑保留在此处 } });
后续你从Fragment B通过interface回调手动更新Fragment A时,直接调用A中封装的列表刷新方法主动拉取数据更新即可。
方案2:先更新Fragment B、后更新Fragment A
如果允许Fragment A自动更新仅需要调整执行顺序,可以选择以下任意一种方式实现:
方式1:主线程任务调度调整顺序
在Fragment A的LiveData回调中,将更新逻辑通过post方法放入主线程消息队列末尾,等待Fragment B的更新逻辑执行完成后再执行:
item_viewmodel.getAllCategoryModel().observe(getViewLifecycleOwner(), new Observer<List<Items>>() { @Override public void onChanged(List<Items> myLists) { new Handler(Looper.getMainLooper()).post(() -> { // 原有Fragment A的列表更新逻辑 }); } });
方式2:拆分LiveData实例
不要让两个Fragment共用同一个ViewModel的同一个LiveData实例,给Fragment B单独分配专属的列表LiveData,编辑保存数据时先更新B的专属LiveData触发B的列表更新,再更新Fragment A使用的全局列表LiveData即可严格控制更新顺序。
内容的提问来源于stack exchange,提问作者Rivke
相关产品推荐
相关产品推荐

