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);' –