2017-10-09 60 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; 
} 
相關問題