2

我想通過自定義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 MyBooksFragmentregisteredFragments SparseArray。這可以解釋爲什麼getRegisteredFragment(2)返回null。但爲什麼MyChatsFragment實際上被創建,並且如果instantiateItem甚至沒有被調用它,該應用程序是完美的功能?

爲什麼MyChatsFragment被添加到registeredFragments SparseArray而其他片段是?

getItem(position)一個可行的解決方案?

檢查this answer後,我已經適應我的SectionsPageAdapter通過重寫instantiateItemdestroyItem,你將能夠檢查下面的代碼:

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

使用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);

+0

正如我在我的帖子中所問,請提供關於'getItem'方法的簡要說明。 –

+0

當你寫'addFragment()'給mFragmentList添加一個片段,並且你也通過調用'mSectionsPageAdapter.addFragment(new MyChatsFragment())'這個方法來添加片段。 和'getItem()'從你添加你的片段的'mFragmentList'中返回一個片段。所以如果你想獲得MyChatsFragment參考,只需使用MyChatsFragment myChatsFragment =(MyChatsFragment)mSectionsPageAdapter.getItem(2);或MyChatsFragment myChatsFragment =(MyChatsFragment) viewPager.getAdapter.getItem(2);' –