2017-10-09 57 views
2

我有4种类型片段的: OpenTextFragment, SingleRadioButtonFragment, DropdownSelectFragment and MultipleCheckboxesFragment如何从ViewPager调用Fragment方法?

这些片段取决于我使用的元件类型显示在ViewPager。这些片段中有一个特定的功能(每个片段都是唯一的),我需要使用MainActivity

ViewPager能有什么,我需要

我需要获得当前片段是在我的ViewPager并使用特定的功能就是在上述

提到的不同片段的N个它。

我在做什么

,我显示在ViewPager这些片段的方法是使用FragmentPagerAdapter

public class QuestionsAdapter extends FragmentPagerAdapter { 
     private ArrayList<SurveyElement> mSurveyElements; 
     private int mAdapterSize = 0; 

     public QuestionsAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     public void updateFragmentAdapter(ArrayList<SurveyElement> fragmentList) { 
      mSurveyElements = fragmentList; 
      mAdapterSize = fragmentList.size(); 
      this.notifyDataSetChanged(); 

     } 

     @Override 
     public Fragment getItem(int position) { 
      SurveyElement surveyElement = mSurveyElements.get(position); 
      switch (surveyElement.getElementType()) { 
       case SurveyElement.OPEN_TEXT: 
        return OpenTextFragment.newInstance(surveyElement, position + 1); 
       case SurveyElement.SINGLE_RADIOBUTTON: 
        return SingleRadioButtonFragment.newInstance(surveyElement, position + 1); 
       case SurveyElement.DROPDOWN_SELECT: 
        return DropdownSelectFragment.newInstance(surveyElement, position + 1); 
       case SurveyElement.MULTIPLE_CHECKBOXES: 
        return MultipleCheckboxesFragment.newInstance(surveyElement, position + 1); 
       default: 
        return OpenTextFragment.newInstance(surveyElement, position + 1); 

      } 
     } 

     @Override 
     public int getCount() { 
      return mAdapterSize; 
     } 
    } 

我试图用这个函数来获取当前片段MainAcitivity

private boolean canIGoToNextQuestion(int position){ // mMyViewPager.getCurrentItem() 

     if (mQuestionsAdapter.getItem(position) instanceof OpenTextFragment){ 
      OpenTextFragment openTextFragment = (OpenTextFragment) mQuestionsAdapter.getItem(position); 
      return openTextFragment.attemptAnswerQuestion(); 
     } 

     // here goes the validations for the others fragments types 
     return false; 
    } 

我正在用

当函数attemptAnswerQuestion()被调用时,此函数内的所有元素都是null

看来我正在制作一个OpenTextFragment的新实例。

好知道

我看到关于这个话题的几个职位,但所有的人都知道你的碎片的位置,但是,在我的情况可能是这样的:

OpenTextFragment可以在位置0,

DropdownSelectFragment在位置1,

MultipleCheckboxesFragment位置2,

再次OpenTextFragment在3位等等...

回答

0

使用在FragmentPagerAdapter的instantiateItem()覆盖,以保持对已经被实例化的ViewPager片段的引用。

既然你在ViewPager片段的可变的量,使用映射到索引映射到每个片段:

public class QuestionsAdapter extends FragmentPagerAdapter { 
    private ArrayList<SurveyElement> mSurveyElements; 
    private int mAdapterSize = 0; 

    //Fragment container: 
    Map<Integer, Fragment> mFragmentMap = new HashMap<>(); 

    public QuestionsAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    public void updateFragmentAdapter(ArrayList<SurveyElement> fragmentList) { 
     mSurveyElements = fragmentList; 
     mAdapterSize = fragmentList.size(); 
     this.notifyDataSetChanged(); 

    } 

    //This populates your Fragment reference map: 
    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Fragment createdFragment = (Fragment) super.instantiateItem(container, position); 
     mFragmentMap.put(position, createdFragment); 
     return createdFragment; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     SurveyElement surveyElement = mSurveyElements.get(position); 
     switch (surveyElement.getElementType()) { 
      case SurveyElement.OPEN_TEXT: 
       return OpenTextFragment.newInstance(surveyElement, position + 1); 
      case SurveyElement.SINGLE_RADIOBUTTON: 
       return SingleRadioButtonFragment.newInstance(surveyElement, position + 1); 
      case SurveyElement.DROPDOWN_SELECT: 
       return DropdownSelectFragment.newInstance(surveyElement, position + 1); 
      case SurveyElement.MULTIPLE_CHECKBOXES: 
       return MultipleCheckboxesFragment.newInstance(surveyElement, position + 1); 
      default: 
       return OpenTextFragment.newInstance(surveyElement, position + 1); 

     } 
    } 

    @Override 
    public int getCount() { 
     return mAdapterSize; 
    } 
} 

然后,可以使用下面的代码在活动呼叫到合适的方法为每种类型的片段。关键是参考实例化并在ViewPager中显示的实际片段:

private boolean canIGoToNextQuestion(int position){ // mMyViewPager.getCurrentItem() 

    Fragment fragment = mQuestionsAdapter.mFragmentMap.get(position); 
    if (fragment != null && fragment instanceof OpenTextFragment){ 
     return ((OpenTextFragment)fragment).attemptAnswerQuestion(); 
    } 

    return false; 
} 
相关问题