Android CardView搜索过滤退格时列表项无法重新显示问题
问题原因
你定义了存储全量数据的fullItemList但过滤逻辑完全没用到它,全程在遍历已经被修改过的展示列表itemModalArrayList:
- 首次输入关键词过滤时,不符合条件的项会从
itemModalArrayList中被清除,列表仅保留匹配项 - 后续退格删除输入内容、更换更短关键词时,过滤逻辑只能从当前剩余的匹配项中做匹配,无法获取之前被过滤掉的原始数据,被隐藏的项自然无法重新显示
- 搜索词为空时你也是把已经裁剪过的
itemModalArrayList加入结果,根本没有恢复全量数据
修复方案
修改MyAdapter中performFiltering的实现,所有匹配逻辑基于全量列表fullItemList执行,修正后的Filter代码如下:
private Filter itemFilter = new Filter() { @Override protected FilterResults performFiltering(CharSequence charSequence) { List<ItemModal> filteredList = new ArrayList<>(); if (charSequence == null || charSequence.length() == 0) { // 搜索词为空时直接返回全量原始数据 filteredList.addAll(fullItemList); } else { String filterPattern = charSequence.toString().toLowerCase().trim(); // 每次匹配都遍历全量列表,不要使用已经被过滤修改过的展示列表 for (ItemModal itemModal : fullItemList) { if (itemModal.getName().toLowerCase().contains(filterPattern)) { filteredList.add(itemModal); } } } FilterResults results = new FilterResults(); results.values = filteredList; results.count = filteredList.size(); return results; } @Override protected void publishResults(CharSequence charSequence, FilterResults filterResults) { itemModalArrayList.clear(); itemModalArrayList.addAll((List<ItemModal>) filterResults.values); notifyDataSetChanged(); } };
兼容补充
如果你后续有动态增删、刷新列表原始数据的需求,必须同步更新fullItemList,否则会出现新增数据搜不到、已删除数据仍显示的问题:
- 单条新增数据时,同时往
itemModalArrayList和fullItemList添加元素 - 整体刷新列表时,先清空两个列表再同时写入新数据,最后调用
notifyDataSetChanged()
内容的提问来源于stack exchange,提问作者5wixy
相关产品推荐
相关产品推荐

