Android空指针异常求助:AdapterAd.getFilter()调用失败
解决Android中AdapterAd.getFilter()空指针问题
核心问题
你遇到的java.lang.NullPointerException本质是:触发onTextChanged回调时,AdapterAd实例仍为null。即便你在onViewCreated中做了初始化,大概率是变量作用域、回调绑定顺序或adapter更新逻辑出了问题。
具体排查与解决步骤
确认Adapter变量的作用域
必须把AdapterAd声明为Fragment的全局成员变量,不能是onViewCreated里的局部变量。示例:// 正确:全局成员变量 private AdapterAd mAdAdapter; @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 初始化全局变量 mAdAdapter = new AdapterAd(...); recyclerView.setAdapter(mAdAdapter); }若在
onViewCreated里声明局部变量AdapterAd adapter = new AdapterAd(...),全局变量会一直是null,回调调用时必然触发空指针。调整TextWatcher的绑定时机
不要在onCreateView阶段就给EditText绑定TextWatcher,必须等mAdAdapter初始化完成后再绑定。示例:@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 1. 先初始化adapter mAdAdapter = new AdapterAd(...); recyclerView.setAdapter(mAdAdapter); // 2. 再绑定TextWatcher EditText searchEt = view.findViewById(R.id.search_et); searchEt.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { mAdAdapter.getFilter().filter(s); } @Override public void afterTextChanged(Editable s) {} }); }绑定过早的话,用户在adapter初始化完成前输入文字,会直接触发回调导致空指针。
添加空指针防御判断
在onTextChanged里直接加非空判断,从根源避免异常:@Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (mAdAdapter != null) { mAdAdapter.getFilter().filter(s); } }检查loadAds方法的adapter赋值逻辑
如果loadAds里重新创建了Adapter实例,一定要同步更新全局的mAdAdapter变量:private void loadAds() { // 加载数据后更新adapter mAdAdapter = new AdapterAd(newDataList); recyclerView.setAdapter(mAdAdapter); mAdAdapter.notifyDataSetChanged(); }要是只创建新Adapter但没赋值给全局变量,回调里用的还是旧的null对象,必然报错。
内容的提问来源于stack exchange,提问作者339 Tisha Hirapara
相关产品推荐
相关产品推荐

