首页 文章

在FragmentPagerAdapter上调用getItem()时,它返回一个空片段

提问于
浏览
-1

我在使用FragmentPagerAdapter时遇到问题 . 我想从View Pager中的片段中检索数据 . 当我调用getItem()方法时,它返回一个Fragment,但它不会创建片段 . 所有片段变量都为空 . 我需要做什么来实例化片段?这是我的适配器 .

public class SubItemAdapter extends FragmentPagerAdapter implements Serializable {
    List<Item> itemList = new ArrayList<>();
    int layout;


    public SubItemAdapter(FragmentManager mgr, List<? extends Item> items, int layout) {
        super(mgr); 
        itemList.addAll(items);
        this.layout = layout; 

    }

    @Override
    public int getCount() {
        return itemList.size();
    }

    @Override
    public SubItemFragment getItem(int position) {
        return SubItemFragment.newInstance(itemList.get(position), layout); 
    }
}

这是viewpager中的片段 .

public class SubItemFragment extends Fragment {
Item item;
View view;
Context mContext;
private static final int RC_BARCODE_CAPTURE = 9001;
private static final String ITEM_KEY = "item";
private static final String LAYOUT_PAGER_KEY = "layout";

public static SubItemFragment newInstance(Item item, int layout) {
    SubItemFragment frag = new SubItemFragment();
    Bundle args = new Bundle();
    args.putSerializable(ITEM_KEY, item);
    args.putInt(LAYOUT_PAGER_KEY, layout);
    frag.setArguments(args);
    return (frag);
}

@Override
public View onCreateView(LayoutInflater inflater,
                         ViewGroup container,
                         Bundle savedInstanceState) {

    int layout = getArguments().getInt(LAYOUT_PAGER_KEY);
    view = inflater.inflate(layout, container, false);
    item = (Item) getArguments().getSerializable(ITEM_KEY); 
    mContext = getContext();
    /* Populate the fragment with data
    . . .
    */
    return (view);
    }

    public Item getItem() {
        item.retrieve_data_and_populate_item();
        return item;
    }
}

我对ViewPager的工作原理并不十分了解,但据我所知,片段在没有设置任何变量的情况下返回的原因是因为ViewPager没有附加片段 . 如何获取getItem(int position)函数以返回初始化的片段?如果我的问题不够清楚,或者您需要查看更多代码,请告诉我 . 提前致谢 .

Edit

我在父片段中设置适配器 . 以下是添加ViewPager的代码:

public class General_Fragment implements SubItemFragment.subItemListener {

    private static final int LAYOUT_PAGER_KEY = R.layout.sub_form_meter_read;
    private SubItemAdapter mAdapter;
    private WrapViewPager mPager;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

    final View rootView = inflater.inflate(R.layout.workorder_detail, container, false);
    meters = getMeterList();
    mPager = rootView.findViewById(R.id.meter_list);
    mPager.addOnPageChangeListener(getOnPageListener());
    mAdapter = buildAdapter(meters);
    mPager.setAdapter(mAdapter);
    return rootView;
    }

    /*. . .*/ 

    private SubItemAdapter buildAdapter(List<? extends Item> items) {
        return new SubItemAdapter(getChildFragmentManager(), //Fragment View
                items, //Item to get data from
                LAYOUT_PAGER_KEY
        );
    }

}

我不认为我的问题在于初始化适配器,因为它确实显示但是当我从片段中检索数据时因为空片段而崩溃

1 回答

  • 0

    我发现了一个类似的问题,解释了我所看到的错误 . 这就是我解决问题的答案 .

    https://stackoverflow.com/a/14039416/9301369

    基本上他说getItem()不像我想的那样检索已经制作的片段 . 它实际上用于创建新的片段 . 这是导致我获得不会返回null但不会被实例化的片段的原因 . 所以我做的是将片段管理器 private FragmentManager mgr; 添加到适配器变量并在构造函数中设置它

    public SubItemAdapter(FragmentManager mgr, List<? extends Item> items, int layout) {
        super(mgr); 
        this.mgr = mgr;
        itemList.addAll(items);
        this.layout = layout; 
    }
    

    然后搜索片段管理器以获得我需要的特定片段 . 传递位置和寻呼机ID, mPager.getID .

    public SubItemFragment getSubItemFragment(int viewPagerId, int fragmentPosition) {
        return (SubItemFragment) mgr.findFragmentByTag("android:switcher:" + viewPagerId + ":" + fragmentPosition);
    }
    

    所以基本上,我认为ViewPager没有附加碎片是错误的 . 片段被附加我只是引用新创建的片段 .

相关问题