如何从ViewPager

时间:2017-10-13 17:48:19

标签: android android-fragments android-viewpager android-pageradapter

在尝试使用自定义MyChatsFragment实例化后,我尝试获取对名为SectionPageAdapter的特定片段的引用。

首先,我正在添加片段

    mSectionsPageAdapter.addFragment(new CatalogFragment());
    mSectionsPageAdapter.addFragment(new MyBooksfragment());
    mSectionsPageAdapter.addFragment(new MyChatsFragment());
    viewPager.setAdapter(mSectionsPageAdapter);

然后我试图以这种方式检索MyChatsFragment

 MyChatsFragment myChatsFragment = (MyChatsFragment) mSectionsPageAdapter
                                                                 .getRegisteredFragment(2);

然而,getRegisteredFragment(2)返回null并且在调试时我注意到以下内容:

在适配器中,instantiateItem仅被调用两次,因此将CatalogFragmentMyBooksFragment添加到registeredFragments SparseArray。这可以解释为什么getRegisteredFragment(2)会返回null。但是,为什么MyChatsFragment实际上是创建的,并且如果instantiateItem甚至没有被调用,应用程序就完全正常运行了?

为什么没有MyChatsFragment被添加到registeredFragments SparseArray而其他片段是什么?

getItem(position)是否可行?

检查this answer后,我通过覆盖SectionsPageAdapterinstantiateItem调整了destroyItem,因为您可以查看以下代码:

public class SectionsPageAdapter extends FragmentPagerAdapter{
private final List<Fragment> mFragmentList = new ArrayList<>();
private final SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

public void addFragment(Fragment fragment)
{
    mFragmentList.add(fragment);
}


public SectionsPageAdapter(FragmentManager FM)
{
    super(FM);
}
@Override
public Fragment getItem(int position) {
   return mFragmentList.get(position);
}

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

@Override
public Object instantiateItem(ViewGroup container, int position) {
    Fragment fragment = (Fragment) super.instantiateItem(container, position);
    registeredFragments.put(position, fragment);
    return fragment;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    registeredFragments.remove(position);
    super.destroyItem(container, position, object);
}

public Fragment getRegisteredFragment(int position) {
    return registeredFragments.get(position);
    }
}

注意:如果需要,我可以分享MyChatsFragment代码。

1 个答案:

答案 0 :(得分:1)

使用viewPager.getAdapter.getItem(position);或家长Activity中的Fragment

说明(已修改) - 正如您撰写的addFragment()mFragmentList添加了一个片段,您也可以通过调用以下方法添加片段:

mSectionsPageAdapter.addFragment(new MyChatsFragment())

getItem()会从mFragmentList返回您添加片段的片段。因此,如果您想获得MyChatsFragment参考,请使用:

MyChatsFragment myChatsFragment = (MyChatsFragment) 
mSectionsPageAdapter .getItem(position);

MyChatsFragment myChatsFragment = (MyChatsFragment) 
viewPager.getAdapter.getItem(position);