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
相关产品推荐
相关产品推荐

