You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

待办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;
}

额外优化建议

  1. 规避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;
}
  1. 安全管理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:26:08