待办APP中搜索框清空后RecyclerView列表项消失的问题咨询
问题排查与修复
你的问题核心出在SQLiteDataBaseClass的getTask()方法中:遍历Cursor创建TaskModel对象后,没有将创建好的任务对象添加到返回的列表里,导致搜索框清空时,适配器拿到的是空列表,RecyclerView自然没有数据可显示。
修复后的getTask()方法
// SQLite类中返回任务列表的方法 public List<TaskModel> getTask() { List<TaskModel> taskModel = new ArrayList<>(); SQLiteDatabase sqLiteDatabase = getReadableDatabase(); Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM " + TABLE_TASK, null); if (cursor.moveToFirst()) { do { TaskModel task = new TaskModel(); task.setId(cursor.getLong(0)); task.setTitle(cursor.getString(1)); task.setCompleted(cursor.getInt(2) == 1); // 新增这行:把创建好的任务对象添加到列表中 taskModel.add(task); } while (cursor.moveToNext()); } // 关闭Cursor避免资源泄漏 cursor.close(); sqLiteDatabase.close(); return taskModel; }
额外优化建议
- 规避SQL注入风险:当前
searchBox()方法用字符串拼接SQL语句,存在注入漏洞,建议改用参数绑定的写法:
public List<TaskModel> searchBox(String query) { List<TaskModel> taskModel = new ArrayList<>(); SQLiteDatabase sqLiteDatabase = getReadableDatabase(); // 使用?作为占位符,避免SQL注入 Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM " + TABLE_TASK + " WHERE title LIKE ?", new String[]{"%" + query + "%"}); if (cursor.moveToFirst()) { do { TaskModel task = new TaskModel(); task.setId(cursor.getLong(0)); task.setTitle(cursor.getString(1)); task.setCompleted(cursor.getInt(2) == 1); taskModel.add(task); } while (cursor.moveToNext()); } cursor.close(); sqLiteDatabase.close(); return taskModel; }
- 安全管理IO资源:Cursor和SQLiteDatabase属于IO资源,推荐用
try-with-resources语法自动关闭,降低资源泄漏概率:
public List<TaskModel> getTask() { List<TaskModel> taskModel = new ArrayList<>(); try(SQLiteDatabase sqLiteDatabase = getReadableDatabase(); Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM " + TABLE_TASK, null)) { if (cursor.moveToFirst()) { do { TaskModel task = new TaskModel(); task.setId(cursor.getLong(0)); task.setTitle(cursor.getString(1)); task.setCompleted(cursor.getInt(2) == 1); taskModel.add(task); } while (cursor.moveToNext()); } } return taskModel; }
内容的提问来源于stack exchange,提问作者Ehsan Taghizadeh
相关产品推荐
相关产品推荐

