我想通过自定义SectionPageAdapter
实例化后,获取对特定片段MyChatsFragment
的引用。如何从ViewPager获取片段引用
首先,我加入片段
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
仅被调用两次,因此添加了CatalogFragment
d MyBooksFragment
至registeredFragments
SparseArray。这可以解释为什么getRegisteredFragment(2)
返回null
。但为什么MyChatsFragment
实际上被创建,并且如果instantiateItem
甚至没有被调用它,该应用程序是完美的功能?
为什么MyChatsFragment
被添加到registeredFragments
SparseArray而其他片段是?
是getItem(position)
一个可行的解决方案?
检查this answer后,我已经适应我的SectionsPageAdapter
通过重写instantiateItem
和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
代码。
正如我在我的帖子中所问,请提供关于'getItem'方法的简要说明。 –
当你写'addFragment()'给mFragmentList添加一个片段,并且你也通过调用'mSectionsPageAdapter.addFragment(new MyChatsFragment())'这个方法来添加片段。 和'getItem()'从你添加你的片段的'mFragmentList'中返回一个片段。所以如果你想获得MyChatsFragment参考,只需使用MyChatsFragment myChatsFragment =(MyChatsFragment)mSectionsPageAdapter.getItem(2);或MyChatsFragment myChatsFragment =(MyChatsFragment) viewPager.getAdapter.getItem(2);' –