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

如何复用同一布局动态创建Fragment并在ViewPager中加载数据解决空指针问题

问题根源

  1. FragmentStatePagerAdapter的getItem方法才是ViewPager获取Fragment实例的官方入口,你在适配器构造函数里手动创建Fragment、开启事务添加的操作完全无效,ViewPager最终加载的是getItem返回的无参数的全新Fragment实例,自然没有设置arguments,调用getArguments()就会返回空,触发空指针。
  2. 就算你之前的手动添加逻辑生效,你在循环外只创建了一个Bundle对象,循环内反复覆写id的值,所有Fragment拿到的都会是最后一条数据的id,也不符合需求。
  3. 额外注意:调用getArguments()前最好做空判断,避免异常崩溃。

修正代码

修正后的ScreenSlidePagerAdapter代码

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
    private JSONArray dataArray; // 把解析好的数组存为成员变量,方便getItem取用

    public ScreenSlidePagerAdapter(FragmentManager fm, String data) {
        super(fm);
        try {
            JSONObject json = new JSONObject(data);
            // 解析完的数组存到成员变量
            this.dataArray = json.getJSONArray("data");
        } catch (JSONException e) {
            e.printStackTrace();
            this.dataArray = new JSONArray(); // 异常时给空数组避免崩溃
        }
    }

    @Override
    public Fragment getItem(int position) {
        FragmentClass fragment = new FragmentClass();
        Bundle args = new Bundle();
        try {
            // 从存好的数组里取对应position的数据
            JSONObject obj = dataArray.getJSONObject(position);
            args.putString("id", obj.optString("id"));
        } catch (JSONException e) {
            e.printStackTrace();
        }
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public int getCount() {
        return dataArray.length(); // 直接用数组长度作为页数
    }
}

优化后的FragmentClass代码(增加空判断避免异常)

public class FragmentClass extends Fragment {
    private TextView txtId;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = (ViewGroup) inflater.inflate(
                R.layout.fragment_screen_slide, container, false);

        txtId = rootView.findViewById(R.id.txtId);
        // 先判空再取值,避免空指针
        if (getArguments() != null) {
            String id = getArguments().getString("id");
            txtId.setText(id);
        } else {
            txtId.setText("无数据");
        }
        return rootView;
    }
}

内容的提问来源于stack exchange,提问作者Roscoe Turner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 05:15:00