如何在不重启Activity的情况下更新加载SQLite数据的RecyclerView
问题根因
你调用notifyDataSetChanged未生效的核心原因是:RecyclerView.Adapter持有的数据集没有更新。notifyDataSetChanged仅会通知Adapter重新读取自身绑定的现有数据集、刷新视图,你只是把新数据写入了SQLite,但是Adapter里存的还是插入前的旧数据列表,自然看不到更新。
可行解决方案
这里给两种最常用的实现方式,按需选择即可:
方案1:接口回调(无依赖,通用度最高)
这是Fragment和宿主Activity通信的官方推荐方式,耦合度低,不需要引入额外组件。
实现步骤:
- 在DialogFragment内定义回调接口,插入数据完成后触发回调
- MainActivity实现该接口,收到回调后更新Adapter的数据集再触发刷新
代码示例:
DialogFragment 侧代码
public class AddDataDialog extends DialogFragment { // 定义回调接口 public interface OnDataInsertedListener { // 可直接回传新插入的数据对象,避免二次查询 void onDataInserted(YourDataEntity newData); } private OnDataInsertedListener insertListener; @Override public void onAttach(@NonNull Context context) { super.onAttach(context); // 绑定宿主Activity的回调实现 if (context instanceof OnDataInsertedListener) { insertListener = (OnDataInsertedListener) context; } else { throw new RuntimeException(context + " 必须实现OnDataInsertedListener接口"); } } // 你自己的插入数据逻辑,执行成功后调用该方法 private void afterInsertSuccess(YourDataEntity newlyInsertedData) { dismiss(); if (insertListener != null) { insertListener.onDataInserted(newlyInsertedData); } } @Override public void onDetach() { super.onDetach(); insertListener = null; // 置空避免内存泄漏 } }
MainActivity 侧代码
public class MainActivity extends AppCompatActivity implements AddDataDialog.OnDataInsertedListener { private List<YourDataEntity> dataList = new ArrayList<>(); private YourRecyclerAdapter adapter; // 原有初始化逻辑,给Adapter绑定初始dataList private void initRecyclerView() { // 从SQLite查询初始数据 dataList = sqliteDao.queryAllData(); adapter = new YourRecyclerAdapter(dataList); recyclerView.setAdapter(adapter); } @Override public void onDataInserted(YourDataEntity newData) { // 方式1:直接追加新数据,性能更高(适用于数据按插入时间倒序/正序排列的场景) dataList.add(newData); adapter.notifyItemInserted(dataList.size() - 1); // 方式2:需重新排序/多端修改数据的场景,重新查询全量数据再更新 // dataList = sqliteDao.queryAllData(); // adapter.updateData(dataList); // adapter.notifyDataSetChanged(); } }
Adapter 补充方法
public class YourRecyclerAdapter extends RecyclerView.Adapter<YourViewHolder> { private List<YourDataEntity> dataList; // 新增更新数据集的方法 public void updateData(List<YourDataEntity> newDataList) { this.dataList = newDataList; } }
方案2:LiveData(Jetpack组件场景下更简洁)
如果你的项目已经接入Jetpack组件,用LiveData可以省去手动写回调的步骤,自动感知数据变化。
实现步骤:
- 把SQLite的全量查询方法封装为返回
LiveData<List<YourDataEntity>>类型,数据库写入操作完成后更新LiveData的值 - MainActivity中观察该LiveData,一旦数据变更自动更新Adapter的数据集并刷新
- DialogFragment插入数据完成后不需要额外写通信逻辑,LiveData会自动推送更新
注意事项
不要直接在DialogFragment中持有MainActivity的RecyclerView/Adapter实例,不仅耦合度极高,还非常容易引发内存泄漏、实例引用错误导致的刷新失效问题。
内容的提问来源于stack exchange,提问作者Eloghosa
相关产品推荐
相关产品推荐

