使用RecyclerView Adapter在两个Fragment间传参时遇空指针异常
问题解决:RecyclerView跳转Fragment传递数据空指针异常
核心问题分析
你代码里的关键错误有两个:
- Fragment实例不匹配:你创建了带Bundle的
DisplayFrag frag实例,但Fragment事务里却用DisplayFrag.class创建新实例,导致之前设置的Arguments完全没被使用,新实例的getArguments()自然返回null。 - 数据类型不匹配:你在Bundle里存的
num是String类型(Integer.toString(ping.getmInt())),但在DisplayFrag里用getInt()获取,即使Bundle不为空,这里也会抛出类型转换异常。
修正后的代码
Adapter内部修正代码
public void onBindViewHolder(@NonNull ViewHolder holder, int position) { StringIntString ping = arrayList.get(position); holder.name.setText(ping.getmString()); holder.desc.setText(ping.getnString()); holder.num.setText(Integer.toString(ping.getmInt())); holder.layout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Bundle bundle = new Bundle(); bundle.putString("name", ping.getmString()); bundle.putString("desc", ping.getnString()); // 直接存int类型更合理 bundle.putInt("num", ping.getmInt()); DisplayFrag frag = new DisplayFrag(); frag.setArguments(bundle); // 使用已设置好Arguments的frag实例,而非.class创建新实例 ((FragmentActivity)view.getContext()).getSupportFragmentManager() .beginTransaction() .setCustomAnimations(R.anim.fade_in, R.anim.slide_out) .replace(R.id.fragview, frag) .commit(); } }); }
DisplayFrag内部修正代码
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { v = inflater.inflate(R.layout.fragment_viewfrag2, container, false); name = v.findViewById(R.id.box1); desc = v.findViewById(R.id.box2); num = v.findViewById(R.id.box3); Bundle bundle = this.getArguments(); // 必须加非空判断,避免异常 if (bundle != null) { name.setText(bundle.getString("name")); desc.setText(bundle.getString("desc")); // 把int类型转为字符串设置到TextView num.setText(String.valueOf(bundle.getInt("num"))); } return v; }
额外优化建议
建议用静态工厂方法创建DisplayFrag并传递参数,避免手动设置Arguments的错误,比如在DisplayFrag里添加:
public static DisplayFrag newInstance(String name, String desc, int num) { DisplayFrag frag = new DisplayFrag(); Bundle bundle = new Bundle(); bundle.putString("name", name); bundle.putString("desc", desc); bundle.putInt("num", num); frag.setArguments(bundle); return frag; }
然后在Adapter里直接调用DisplayFrag.newInstance(ping.getmString(), ping.getnString(), ping.getmInt())获取实例,更规范也不容易出错。
内容的提问来源于stack exchange,提问作者Shakthi
相关产品推荐
相关产品推荐

