Android开发RecyclerView内ImageButton点击跳转报空指针异常问题求助
问题原因
- 你出现空指针崩溃的核心原因是:
R.id.btn_piechart是RecyclerView子项布局里的控件,不在MainActivity的布局层级中,直接在MainActivity中调用findViewById(R.id.btn_piechart)只能返回null,调用空对象的方法就会触发崩溃。 - 你的点击事件设置逻辑错误:RecyclerView的所有子项控件的事件都应该在适配器的ViewHolder中进行绑定,不能直接在Activity中对子项控件设置监听。
修复步骤
1. 删除MainActivity中的错误代码
把你在MainActivity中添加的查找ImageButton并设置点击事件的代码完全删除,这段逻辑本身就不符合RecyclerView的使用规范。
2. 修改QuestionAdapter的MyViewHolder逻辑
修改后的ViewHolder代码如下:
public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ public TextView tvNom; // 新增ImageButton变量 public ImageButton btnPiechart; OnQuestionListener onQuestionListener; public MyViewHolder(LinearLayout v, OnQuestionListener onQuestionListener) { super(v); tvNom = v.findViewById(R.id.tvNom); // 绑定子项里的ImageButton btnPiechart = v.findViewById(R.id.btn_piechart); this.onQuestionListener = onQuestionListener; itemView.setOnClickListener(this); // 给ImageButton也设置同一个点击监听器 btnPiechart.setOnClickListener(this); } @Override public void onClick(View view) { onQuestionListener.onQuestionClick(getAdapterPosition()); } public interface OnQuestionListener{ void onQuestionClick(int position); } }
3. 可选:避免ImageButton抢夺点击焦点
如果修改后出现点击Item空白区域不生效的问题,可以在子项布局的ImageButton标签中添加以下属性:
android:focusable="false" android:clickable="false"
添加后不需要给按钮单独设置点击监听,按钮会把点击事件透传给父布局的itemView,也能实现点击按钮触发Item点击的效果。
效果说明
修改完成后,不管你点击Item的TextView区域还是ImageButton区域,都会触发OnQuestionListener的onQuestionClick回调,你原来在MainActivity中实现的跳转逻辑不需要做任何改动,就能实现两者点击跳转逻辑一致的需求。
内容的提问来源于stack exchange,提问作者Herr Rkt
相关产品推荐
相关产品推荐

