我创建了一个待办事项列表应用程序,当我添加一些任务时,它们会在 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) {
}
});
}
仔细检查您的代码后,我发现
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;
}