package com.grilledmonkey.grilledui.adapters; import java.util.ArrayList; import java.util.List; import java.util.Locale; import android.app.ActionBar; import android.app.ActionBar.Tab; import android.content.Context; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.widget.ArrayAdapter; import com.grilledmonkey.grilledui.TabActivity; import com.grilledmonkey.grilledui.xml.XmlSectionReader; /** * This is adapter for {@link TabActivity} tabs. It stores and manages tabs, * handles their integration with ViewPager and so on. Methods are self * explaining. * <p/> * You can use {@link XmlSectionReader} to generate new adapter populated with tabs * from XML resource. * * @author Aux * */ public class SectionAdapter extends FragmentPagerAdapter { private final List<Fragment> sections = new ArrayList<Fragment>(); private final List<String> titles = new ArrayList<String>(); private final ActionBar actionBar; private final ActionBar.TabListener tabListener; private ArrayAdapter<String> arrayAdapter = null; /** * This constructor should be used when not using tabs. * * @param fm FragmentManager as required by FragmentPagerAdapter */ public SectionAdapter(FragmentManager fm) { this(fm, null, null); } /** * This constructor should be used when using tabs. * * @param fm FragmentManager as required by FragmentPagerAdapter * @param actionBar ActionBar of current activity * @param tabListener object which will listen for tab events */ public SectionAdapter(FragmentManager fm, ActionBar actionBar, ActionBar.TabListener tabListener) { super(fm); this.actionBar = actionBar; this.tabListener = tabListener; } public SectionAdapter add(Fragment fragment, String title) { titles.add(title); sections.add(fragment); if(actionBar != null) { actionBar.addTab(createTab(title)); } if(arrayAdapter != null) { arrayAdapter.notifyDataSetChanged(); } notifyDataSetChanged(); return(this); } public SectionAdapter add(int position, Fragment fragment, String title) { titles.add(position, title); sections.add(position, fragment); if(actionBar != null) { actionBar.addTab(createTab(title), position); } if(arrayAdapter != null) { arrayAdapter.notifyDataSetChanged(); } notifyDataSetChanged(); return(this); } public void setTitle(int position, String title) { titles.set(position, title); if(actionBar != null) { actionBar.getTabAt(position).setText(title); } if(arrayAdapter != null) { arrayAdapter.notifyDataSetChanged(); } } public String getTitle(int position) { return(titles.get(position)); } private Tab createTab(String title) { Tab tab = actionBar.newTab(); tab.setText(title.toUpperCase(Locale.getDefault())); tab.setTabListener(tabListener); return(tab); } public Fragment remove(int position) { titles.remove(position); if(actionBar != null) { actionBar.removeTabAt(position); } if(arrayAdapter != null) { arrayAdapter.notifyDataSetChanged(); } Fragment removed = sections.remove(position); notifyDataSetChanged(); return(removed); } public Tab getTab(int position) { return(actionBar != null ? actionBar.getTabAt(position) : null); } /** * This method is used for generating an adapter compatible * with lists and other UI elements in Android. Generated ArrayAdapter * is lazy-loaded and notified of all changes properly. * * @param context * @param layoutId * @param viewId * @return */ public ArrayAdapter<String> getArrayAdapter(Context context, int layoutId, int viewId) { if(arrayAdapter == null) { arrayAdapter = new ArrayAdapter<String>(context, layoutId, viewId, titles); } return(arrayAdapter); } @Override public Fragment getItem(int position) { return(sections.get(position)); } @Override public int getCount() { return(sections.size()); } }