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

Posted

技术标签:

【中文标题】在 FragmentPagerAdapter 上调用 getItem() 时,它返回一个空片段【英文标题】:When calling getItem() on FragmentPagerAdapter it returns an empty fragment 【发布时间】:2018-07-12 07:33:12 【问题描述】:

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

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) 函数返回已初始化的片段? 如果我的问题不够清楚,或者您需要查看更多代码,请告诉我。 提前致谢。

编辑

我在父片段中设置适配器。下面是添加 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
        );
    


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

【问题讨论】:

您在 ViewPager 上实际设置的适配器在哪里? 【参考方案1】:

我发现了一个类似的问题,解释了我正在查看的内容是错误的。这是引导我找到解决方案的答案。

https://***.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 没有附加片段的假设是错误的。片段已附加,我只是在引用新创建的片段。

【讨论】:

以上是关于在 FragmentPagerAdapter 上调用 getItem() 时,它返回一个空片段的主要内容,如果未能解决你的问题,请参考以下文章

FragmentPagerAdapter 在调用 notifyDataSetChanged 后不会从 0 开始位置

如何在 FragmentPagerAdapter 中添加片段标签以便稍后引用片段?

FragmentPagerAdapter在ViewPager中无法正常工作

ViewPager中的FragmentPagerAdapter,FragmentStatePagerAdapter

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

如何刷新 FragmentPagerAdapter 的片段?