You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用RecyclerView Adapter在两个Fragment间传参时遇空指针异常

问题解决:RecyclerView跳转Fragment传递数据空指针异常

核心问题分析

你代码里的关键错误有两个:

  1. Fragment实例不匹配:你创建了带Bundle的DisplayFrag frag实例,但Fragment事务里却用DisplayFrag.class创建新实例,导致之前设置的Arguments完全没被使用,新实例的getArguments()自然返回null。
  2. 数据类型不匹配:你在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:20:22