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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:12:24