1 回答
TA贡献1875条经验 获得超5个赞
目前还不清楚您的问题究竟是什么,但从我的想法来看:
每次用户键入一个新字符时,
onTextChanged
都会触发另一个事件,并且由于您没有清除中间的适配器,显然您的addTask
输入会累积。afterTextChanged
被调用 afteronTextChanged
,因此如果您在填充适配器后立即清除它,它将最终为空。我不确定是notifyDataSetChanged
立即重绘 RecyclerView 还是将其排队,但很可能另一个 notifyDataSetChanged 可能会在此期间adapter.clearAll
或其他地方潜入,让您留下空视图。您应该在重新填充之前立即清除适配器,而不是之后立即清除。您不需要
notifyDataSetChanged
在每个addTask
. 添加当前迭代的所有任务,然后调用notify...
一次。如果您继续阅读,
ontextChanged
您会看到,count
参数中仅显示更改了多少个字符(或者更确切地说,当前键入的单词或 smth 中有多少个字符),使用它来检测是否CharSequence s
为空并不是最佳选择。而是检查CharSequence s
.
所以你需要做的是:
@Override
public void onTextChanged (CharSequence s, int start, int before, int count) {
if (s.length() == 0) { // if empty I show to user nothing
adapter.clearAll();
adapter.notifyDataSetChanged();
} else {
Cursor cursor = database.rawQuery("SELECT * FROM todo WHERE task LIKE '%" + String.valueOf(s) + "%'", null); // ask for data from database
adapter.clearAll();
if (cursor.moveToFirst()) { // if the response wasn't empty
do {
// add filter data in adapter and save adapter(notifyDataSetChanged();)
adapter.addTask(cursor.getString(cursor.getColumnIndex("task")));
} while (cursor.moveToNext());
}
cursor.close();
adapter.notifyDataSetChanged();
}
}
如果您的适配器按我的预期工作,那就应该这样做。你永远不表明您RecyclerView适配器,所以我不知道什么addTask和clearAll做。
添加回答
举报