切回Fragment时Flowable<List<T>>返回空列表导致RecyclerView无数据求助
问题根因与解决方案
1. 核心问题:DataBinding生命周期所有者配置错误
你在MyItemFragment的onCreateView方法中传入this作为DataBinding的生命周期所有者,而使用Navigation组件跳转时,原Fragment仅销毁View(回调onDestroyView),Fragment实例仍保留在返回栈中。返回重建View时,新的Binding实例无法正确接收LiveData更新,导致UI不刷新显示空白。
修复方案:将mDataBinding.setLifecycleOwner(this)修改为:
mDataBinding.setLifecycleOwner(getViewLifecycleOwner());
让DataBinding和Fragment的View生命周期绑定,View销毁时自动解绑观察者,重建时可正常接收LiveData的缓存值。
2. Repository层实现缺陷
2.1 Flowable未缓存结果
你在MyItemRepository.getItemsList()中创建的Flowable是冷流,未添加缓存操作符,若触发二次订阅会重新执行网络请求,请求返回前页面会显示空白。
修复方案:给返回的Flowable添加cache()操作符,缓存请求结果:
return list.subscribeOn(Schedulers.io()).cache();
2.2 单例设计存在数据冲突风险
MyItemRepository采用单例模式,内部的list变量是全局共享的,若有多个页面调用getList()会互相覆盖Flowable实例,导致数据异常。
修复方案:建议移除Repository的单例设计,每个ViewModel对应独立的Repository实例,避免多页面数据互相影响。
3. ViewModel层MediatorLiveData冗余实现
当前用MediatorLiveData包裹ReactiveStreams转换后的LiveData、收到一次值就移除源的逻辑多余,可能因postValue时序问题导致值未正确缓存。
修复方案:直接存储转换后的LiveData即可:
public LiveData<List<T>> getList() { if (list == null) { list = new MediatorLiveData<>(); LiveData<List<T>> source = LiveDataReactiveStreams.fromPublisher(mRepository.getList()); list.addSource(source, list::postValue); } return list; }
4. Adapter更新逻辑检查
确认MyItemAdapter.updateList()方法中正确调用了notifyDataSetChanged()或ListDiffer的更新逻辑,否则Adapter收到新列表也不会触发RecyclerView刷新。
内容的提问来源于stack exchange,提问作者mantc_sdr

