如何复用同一布局动态创建Fragment并在ViewPager中加载数据解决空指针问题
问题根源
FragmentStatePagerAdapter的getItem方法才是ViewPager获取Fragment实例的官方入口,你在适配器构造函数里手动创建Fragment、开启事务添加的操作完全无效,ViewPager最终加载的是getItem返回的无参数的全新Fragment实例,自然没有设置arguments,调用getArguments()就会返回空,触发空指针。- 就算你之前的手动添加逻辑生效,你在循环外只创建了一个Bundle对象,循环内反复覆写
id的值,所有Fragment拿到的都会是最后一条数据的id,也不符合需求。 - 额外注意:调用
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
相关产品推荐
相关产品推荐

