在尝试使用自定义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
仅被调用两次,因此将CatalogFragment
和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
代码。
答案 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);