我想通過自定義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);' –