0

我使用TabLayout + ViewPager来显示几个选项卡。根据服务器响应,我想要创建两种可能的方案:第一个中有三个选项卡,第二个中只有两个,即“删除”位置0中的选项卡。处理多种场景的TabLayout

由于我正在'在第一个选项卡中,所有依赖位置执行与某个特定片段相关的任何方法都变得过时,并且很可能会通过instanceof检查。

例如,这是FragmentStatePagerAdaptergetItem,它不会在瞬间处理第二个场景:

@Override 
public Fragment getItem(int position) { 
    AbstractFragment fragment; 
    switch (position) { 
     case 0: 
      fragment = new MainFragment(); 
      break; 
     case 1: 
      fragment = new MessagesFragment(); 
      break; 
     case 2: 
      fragment = new SearchFragment(); 
      break; 
     default: 
      return null; 
    } 
    return fragment; 
} 

侦听例如MainActivity(支票将在第二个方案失败):

Fragment fragment = viewPagerAdapter.getRegisteredFragment(2); 
if (fragment instanceof SearchFragment) { 
    ((SearchFragment)fragment).doStuff(); 

} 

我唯一的想法是检查服务器响应(即,如果有两个或三个选项卡),在每一个听者MainActivity,并在每getItem的情况下,这是一个可怕的小号在我看来的解决方案。有没有更好的方法来处理这个问题?

回答

1

由于只有几个标签,一个好的办法是让你想显示片段的列表:

List<AbstractFragment> fragments = new ArrayList<>(); 
if (showFirstTab) { 
    fragments.add(new MainFragment()); 
} 
fragments.add(new MessagesFragment()); 
fragments.add(new SearchFragment()); 

,然后在getItem方法,做这样的:

@Override 
public Fragment getItem(int position) { 
    if (fragments.size() > position) { 
     return fragments.get(position); 
    } 
    return null; 
} 

当您需要获取特定片段时,可以获取fragments列表并在其上测试instanceof

让我知道它是否对你有帮助。

+0

@NeriaNachum这是否解决了您的问题?如果是,请接受答案 –

0

可以使用自定义片段寻呼机适配器通过

位置
public abstract class FragmentPagerAdapter extends PagerAdapter { 
    private static final String TAG = "FragmentPagerAdapter"; 
    private static final boolean DEBUG = false; 

    private final FragmentManager mFragmentManager; 
    private FragmentTransaction mCurTransaction = null; 
    private Fragment mCurrentPrimaryItem = null; 
    private String mAdapterClassName; 

    protected FragmentPagerAdapter(FragmentManager fm, String adapterClassName) { 
     mFragmentManager = fm; 
     mAdapterClassName = adapterClassName; 
    } 

    /** 
    * Return the Fragment associated with a specified position. 
    */ 
    protected abstract Fragment getItem(int position); 

    @Override 
    public void startUpdate(ViewGroup container) { 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     if (mCurTransaction == null) { 
      mCurTransaction = mFragmentManager.beginTransaction(); 
     } 

     // Do we already have this fragment? 
     String name = makeFragmentTag(position); 
     Fragment fragment = mFragmentManager.findFragmentByTag(name); 
     if (fragment != null) { 
      mCurTransaction.attach(fragment); 
     } else { 
      fragment = getItem(position); 
      mCurTransaction.add(container.getId(), fragment, 
        makeFragmentTag(position)); 
     } 
     if (fragment != mCurrentPrimaryItem) { 
      fragment.setMenuVisibility(false); 
      fragment.setUserVisibleHint(false); 
     } 

     return fragment; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     if (mCurTransaction == null) { 
      mCurTransaction = mFragmentManager.beginTransaction(); 
     } 
     mCurTransaction.detach((Fragment) object); 
    } 

    @Override 
    public void setPrimaryItem(ViewGroup container, int position, Object object) { 
     Fragment fragment = (Fragment) object; 
     if (fragment != mCurrentPrimaryItem) { 
      if (mCurrentPrimaryItem != null) { 
       mCurrentPrimaryItem.setMenuVisibility(false); 
       mCurrentPrimaryItem.setUserVisibleHint(false); 
      } 
      if (fragment != null) { 
       fragment.setMenuVisibility(true); 
       fragment.setUserVisibleHint(true); 
      } 
      mCurrentPrimaryItem = fragment; 
     } 
    } 

    @Override 
    public void finishUpdate(ViewGroup container) { 
     if (mCurTransaction != null) { 
      mCurTransaction.commitAllowingStateLoss(); 
      mCurTransaction = null; 
      mFragmentManager.executePendingTransactions(); 
     } 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return ((Fragment) object).getView() == view; 
    } 

    @Override 
    public Parcelable saveState() { 
     return null; 
    } 

    @Override 
    public void restoreState(Parcelable state, ClassLoader loader) { 
    } 

    /** 
    * Return a unique identifier for the item at the given position. 
    * <p/> 
    * <p>The default implementation returns the given position. 
    * Subclasses should override this method if the positions of items can change.</p> 
    * 
    * @param position Position within this adapter 
    * @return Unique identifier for the item at position 
    */ 
    private long getItemId(int position) { 
     return position; 
    } 

    public String makeFragmentTag(int position) { 
     return "purplle:switcher:" + mAdapterClassName + ":" + position; 
    } 

    public static String makeFragmentTag(int position,String adapterClassName) { 
     return "purplle:switcher:" + adapterClassName + ":" + position; 
    } 
} 

获得片段现在只需通过FragmentPagerAdapter

扩展您的viewPager适配器类来获取片段的活性。

getSupportFragmentManager().findFragmentByTag(mPagerAdapter.makeFragmentTag(0) //Postion of fragment to access