2017-10-18 151 views
0

我目前有一个FragmentPagerAdapter,通过getItem(int position)方法创建每个片段的新实例。但是,我不太清楚如何访问我再次创建的片段。是否有另一个类可以从FragmentPagerAdapter调用以选择在例如位置12创建的特定片段的公共方法?如何访问FragPagerAdapter中的特定片段?

public class ChannelFragmentAdapter extends FragmentPagerAdapter { 
    private int numChannels; 
    public ChannelFragmentAdapter(FragmentManager fm, Activity context, PatientSettings user) { 
     super(fm); 
     this.context = context; 
     numChannels = user.channelsLimit; 
     for(int i = 1; i <= numChannels; i++){ 
      channelTabs.add("" + i); 
     } 
    } 

    @Override 
    public int getCount() { 
     return channelTabs.size(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     //new instance is a static factory for creating Fragment objects 
     return ChannelFragment.newInstance(position + 1, this); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     //generate title based on item position 
     //return tabTitles[position]; 
     return channelTabs.get(position); 
    } 
} 
+0

您能否向我们提供您的代码? – Jerrol

+0

我会用相关的代码更新我的问题。 –

回答

1

我想你正试图创建一个支持超过5个片段一viewpager,因此使用FragmentStatePagerAdapter更好。

回到你的问题,使用Fragment标签,并通过findFragmentByTag()进入。在您的适配器中,将它们存储在一个列表中,并在需要时获取它们。

public class ChannelFragmentAdapter extends FragmentPagerAdapter { 
    private int numChannels; 
    Map<Integer, String> tags; 

    public ChannelFragmentAdapter(FragmentManager fm, Activity context, PatientSettings user) { 
     super(fm); 
     this.context = context; 
     numChannels = user.channelsLimit; 
     tags = new HashMap<>(); 
     for (int i = 1; i <= numChannels; i++) { 
      channelTabs.add("" + i); 
     } 
    } 

    @Override 
    public int getCount() { 
     return channelTabs.size(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     //new instance is a static factory for creating Fragment objects 
     return ChannelFragment.newInstance(position + 1, this); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     //generate title based on item position 
     //return tabTitles[position]; 
     return channelTabs.get(position); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Fragment createdFragment = (Fragment) super.instantiateItem(container, position); 
     tags.put(position, createdFragment.getTag()); 
     // ... save the tags somewhere so you can reference them later 
     return createdFragment; 
    } 
} 

注意:使用findFragmentByTag()时请检查为空,您的碎片可能被破坏或替换。

+0

感谢您的回答。现在我很好奇,因为FragmentStatePagerAdapter和FragmentPagerAdapter如何组织/使用它们中包含的片段。 –

+0

用简单的方法思考,如果你想创建大量的片段(比如看书应用),可以使用FragmentStatePagerAdapter –

相关问题