为什么当搜索框为空时,回收器项目会消失?

问题描述 投票:0回答:1

我创建了一个待办事项列表应用程序,当我添加一些任务时,它们会在 Recycler 中正确显示。 现在,添加任务后,我想要搜索。 当我用字符填充搜索框时,它会正确搜索任务,但是一旦搜索框为空(其长度变为零),所有先前存在的列表都无法显示,但如果它们存在于数据库中

适配器类

// To set the list of tasks class inside the adapter to display the tasks
public void setTask(List<TaskModel> task) {
    this.taskModel = task;
    notifyDataSetChanged();
}

SQLiteDataBase类

// This method is the search command inside the SQLite class
public List<TaskModel> searchBox(String query) {
    List<TaskModel> taskModel = new ArrayList<>();
    SQLiteDatabase sqLiteDatabase = getReadableDatabase();
    Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM " + TABLE_TASK + " WHERE title LIKE '%" + query + "%'", 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());
    }
    sqLiteDatabase.close();
    return taskModel;
}

// Method to return list of tasks in SQLite class
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);
        } while (cursor.moveToNext());
    }
    sqLiteDatabase.close();
    return taskModel;
}

主要活动

public void setSearchBox() {
    searchBox.addTextChangedListener(new TextWatcher() {
        
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }
        
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s.length() > 0) {
                List<TaskModel> task = sqLite.searchBox(s.toString());
                adapter.setTask(task);
            } else {
                List<TaskModel> task = sqLite.getTask();
                adapter.setTask(task);
            }
        }
       
        @Override
        public void afterTextChanged(Editable s) {
        
        }
    });
}
android sqlite android-recyclerview adapter
1个回答
0
投票

仔细检查您的代码后,我发现

getTask()
方法中存在一个问题。您没有在列表
taskModel
List<TaskModel>
中添加从数据库获取的数据,并且将空列表传递给适配器,这就是为什么数据库中有数据但未在
RecyclerView
中显示。

getTask()
方法更新为此:

// Method to return list of tasks in SQLite class
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);  // <<--- ADD THIS LINE 
        } while (cursor.moveToNext());
    }
    sqLiteDatabase.close();
    return taskModel;
}

© www.soinside.com 2019 - 2024. All rights reserved.