点击RecyclerView列表项内按钮时同项EditText空引用异常如何解决
问题根因
- 核心原因是id大小写不匹配:布局adsoffer_item.xml中EditText的id是
@+id/emailbox(小写b),但ViewHolder中查找时用的是R.id.emailBox(大写B),导致findViewById返回null,调用getText就触发空指针。 - 次要问题1:列表项布局inflate参数错误,未传入parent导致布局参数失效
- 次要问题2:Fragment数据加载顺序错误,先调用notifyDataSetChanged再添加数据,列表刷新异常
- 次要问题3:onBindViewHolder中重复创建Retrofit实例,性能冗余
修复步骤
1. 修正id匹配问题
把AdsOfferAdapter中AdsOfferViewHolder构造函数里的邮箱查找代码改成:
email = itemView.findViewById(R.id.emailbox); // 改为小写b,和布局id一致
2. 修正布局inflate逻辑
修改onCreateViewHolder中的布局加载代码:
// 旧代码:View view = LayoutInflater.from(context).inflate(R.layout.adsoffer_item,null); // 新代码: View view = LayoutInflater.from(context).inflate(R.layout.adsoffer_item, parent, false);
3. 修正Fragment数据加载顺序
修改LoadAdsOffers方法中数据更新逻辑,先添加数据再通知刷新:
if(response.code()==200){ dialog.dismiss(); // 先加数据 Collections.addAll(offers,response.body()); // 再设置适配器/通知刷新 binding.listadsoffers.setAdapter(adapter); adapter.notifyDataSetChanged(); }
4. 优化Retrofit实例创建(可选)
Retrofit实例全局只需要创建一次,把Adapter中onBindViewHolder里的Retrofit创建代码移到构造函数中:
public AdsOfferAdapter(Context context, ArrayList<AdsOffer> AdsOffers) { this.context = context; this.Adsoffers = AdsOffers; // 移到这里创建一次即可 retrofit = new Retrofit.Builder() .baseUrl(util.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); retrofitInterface = retrofit.create(RetrofitInterface.class); }
5. 增加空判断避免崩溃(可选)
点击按钮获取邮箱时增加判空和输入校验:
holder.btnRequest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (holder.email == null || holder.email.getText() == null) { Toast.makeText(context, "输入框加载异常", Toast.LENGTH_SHORT).show(); return; } String email = holder.email.getText().toString().trim(); if (email.isEmpty()) { Toast.makeText(context, "请输入邮箱地址", Toast.LENGTH_SHORT).show(); return; } // 后续发送请求逻辑 } });
内容的提问来源于stack exchange,提问作者jack john
相关产品推荐
相关产品推荐

