Android Room无法更新条目列表及点击添加收藏报ringTonesDao空指针求助
问题根源
你遇到的空指针异常是因为RingTonesAdapter中声明的RingTonesDao仅做了定义,没有完成初始化赋值。同时Room的DAO接口不需要你手动实现所有方法,Room框架会在编译阶段自动生成对应的实现类,你只需要通过自定义的RoomDatabase子类获取DAO实例即可。
修复步骤
- 修改RingTonesAdapter的构造方法,增加DAO传参
public class RingTonesAdapter extends RecyclerView.Adapter<RingTonesAdapter.ringTonesViewHolder> { private List<RingTones> ringTonesList; RingTonesDao ringTonesDao; // 修改构造方法,接收RingTonesDao实例 public RingTonesAdapter(List<RingTones> ringTonesList, RingTonesDao ringTonesDao) { this.ringTonesList = ringTonesList; this.ringTonesDao = ringTonesDao; } // ... 其余原有代码保持不变
- 在初始化Adapter的页面(Activity/Fragment)传入DAO实例
首先你需要先获取自己定义的RoomDatabase实例(建议做成全局单例避免重复创建),再通过数据库实例拿到DAO,初始化Adapter时传入即可:
// 示例代码,替换成你自己定义的RoomDatabase类名、数据库名 AppDatabase db = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "ringtone_db").build(); RingTonesDao ringTonesDao = db.ringTonesDao(); // 初始化Adapter时传入两个参数 RingTonesAdapter adapter = new RingTonesAdapter(ringTonesList, ringTonesDao); recyclerView.setAdapter(adapter);
- 修复收藏更新后列表不刷新的问题
你原有代码调用DAO的update方法后,没有更新本地列表数据也没有通知Adapter刷新,同时Room默认禁止主线程操作数据库,需要修改点击事件逻辑:
holder.btn_addToFavorites.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 数据库操作放到子线程执行 new Thread(() -> { int currentPos = holder.getAdapterPosition(); RingTones currentTone = ringTonesList.get(currentPos); // 取反当前收藏状态 boolean newFavStatus = !currentTone.isFavorite(); // 更新数据库 ringTonesDao.update(newFavStatus, currentTone.getId()); // 更新本地列表数据 currentTone.setFavorite(newFavStatus); // 切回主线程刷新对应条目 v.post(() -> notifyItemChanged(currentPos)); }).start(); } });
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

