主Activity清空数据库后,如何通知Fragment内RecyclerView适配器数据变更?
下面是几种通用的实现方案,可根据项目架构和复杂度选择:
接口回调方案
在Fragment内定义一个回调接口(比如OnDataClearedListener),包含onDataCleared()方法;Fragment在onAttach()阶段将自身注册到Activity(要求Activity实现该接口)。Activity完成数据库清空操作后,调用接口的onDataCleared()方法,Fragment收到回调后重新从Room拉取数据,再通过adapter.notifyDataSetChanged()(或DiffUtil实现高效更新)通知适配器刷新列表。LiveData响应式方案
如果Room的查询方法返回LiveData<List<YourEntity>>,直接在Fragment中观察这个LiveData即可。当Activity清空数据库后,Room会自动触发LiveData的更新,Fragment的观察者会收到空列表数据,此时直接将新数据设置给适配器,无需额外手动通知。这是Room官方推荐的方式,代码简洁且自带生命周期感知。事件总线方案
使用EventBus等事件总线库,在Activity清空数据库后发送DataClearedEvent事件;Fragment中注册该事件的订阅者,收到事件后触发数据刷新和适配器更新。不过这种方式会增加依赖,且相比LiveData缺乏生命周期感知,需要注意处理内存泄漏问题。直接调用Fragment方法方案
Activity通过findFragmentById()或findFragmentByTag()获取容器内的Fragment实例,确认Fragment处于活跃状态后,调用Fragment暴露的公共方法(比如refreshRecyclerViewData()),在该方法内Fragment重新获取数据并更新适配器。这种方式耦合度较高,复杂页面中容易出现空指针风险,不推荐大规模使用。
内容的提问来源于stack exchange,提问作者user18222209

