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

Android ListView使用SearchView搜索时出现空指针异常

解决SearchView筛选时触发的NullPointerException问题

嘿,这个空指针问题我做列表筛选的时候也踩过坑!咱们先拆解下问题根源,再一步步解决:

问题根源

从报错栈信息能明确看出来:你的自定义适配器AD里的getCount()方法,在调用List.size()时,这个List对象是null。SearchView输入字符后会触发适配器的数据更新,这时候如果筛选后的数据源没正确初始化(变成了null),就会直接触发空指针崩溃。

具体解决方案

1. 给Adapter的getCount()加非空判断

先检查你的AD.java第35行的getCount()方法,大概率是直接返回了List的size,没做null校验。把它改成这样:

@Override
public int getCount() {
    // 如果数据源为null,返回0而不是调用size()
    return mDataList == null ? 0 : mDataList.size();
}

这样哪怕数据源暂时是null,也不会触发空指针,列表会显示空状态而不是崩溃。

2. 确保筛选逻辑永远返回非null的List

在处理SearchView的筛选逻辑时,别让筛选结果变成null!比如如果没有匹配到任何数据,要返回空的ArrayList而不是null:

// 示例筛选逻辑
private List<YourModel> filterData(String query) {
    List<YourModel> filteredList = new ArrayList<>();
    if (!TextUtils.isEmpty(query)) {
        for (YourModel item : mOriginalData) {
            if (item.getName().contains(query)) {
                filteredList.add(item);
            }
        }
    } else {
        // 搜索为空时返回原始数据
        filteredList = mOriginalData;
    }
    // 确保返回的永远不是null
    return filteredList;
}

更新适配器数据时直接传这个筛选后的List就行,不用额外判断null:

mAdapter.setData(filteredList);

3. 初始化Adapter时传入空List而非null

创建Adapter实例的时候,别传null当初始数据源,直接传一个空的ArrayList:

// 正确写法
AD mAdapter = new AD(new ArrayList<>());
// 错误写法 ❌
// AD mAdapter = new AD(null);

从根源上避免数据源一开始就是null的情况。

额外调试小技巧

你可以在Adapter的setData方法里加个日志,看看每次更新的数据是不是null:

public void setData(List<YourModel> newData) {
    Log.d("ADAdapter", "New data is null? " + (newData == null));
    mDataList = newData;
    notifyDataSetChanged();
}

这样就能快速定位是不是筛选逻辑里不小心返回了null。

内容的提问来源于stack exchange,提问作者shanto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:37:55