package com.athena.asm.Adapter; import java.lang.ref.SoftReference; import java.util.ArrayList; import java.util.Hashtable; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewPager; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.ActionBar.Tab; import com.actionbarsherlock.app.SherlockFragmentActivity; import com.athena.asm.aSMApplication; import com.athena.asm.listener.OnKeyDownListener; import com.athena.asm.viewmodel.HomeViewModel; public class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener, ViewPager.OnPageChangeListener { private final SherlockFragmentActivity m_activity; private final ActionBar m_actionBar; private final ViewPager m_viewPager; private final ArrayList<TabInfo> m_tabs = new ArrayList<TabInfo>(); private HomeViewModel m_viewModel; private boolean m_isInited = false; // save cached fragments which implement OnKeyDownListener private Hashtable<Integer, SoftReference<OnKeyDownListener>> m_keyListeners = new Hashtable<Integer, SoftReference<OnKeyDownListener>>(); static final class TabInfo { private final Class<?> clss; private final Bundle args; TabInfo(Class<?> _class, Bundle _args) { clss = _class; args = _args; } } public void finishInit() { m_isInited = true; } public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) { super(activity.getSupportFragmentManager()); m_activity = activity; m_viewModel = ((aSMApplication) activity.getApplication()).getHomeViewModel(); m_actionBar = activity.getSupportActionBar(); m_viewPager = pager; m_viewPager.setAdapter(this); m_viewPager.setOnPageChangeListener(this); } public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { TabInfo info = new TabInfo(clss, args); tab.setTag(info); tab.setTabListener(this); m_tabs.add(info); m_actionBar.addTab(tab); notifyDataSetChanged(); } @Override public int getCount() { return m_tabs.size(); } @Override public Fragment getItem(int position) { TabInfo info = m_tabs.get(position); Fragment m = Fragment.instantiate(m_activity, info.clss.getName(), info.args); // cache the fragment as SoftReference object if (m instanceof OnKeyDownListener) { // only if the fragment has implemented OnKeyDownListener interface OnKeyDownListener listener = (OnKeyDownListener) m; m_keyListeners.put(position, new SoftReference<OnKeyDownListener>(listener)); } return m; } // get keydown listener by position, null might be returned public OnKeyDownListener getOnKeyDownListener(int position) { try { SoftReference<OnKeyDownListener> sf = m_keyListeners.get(position); OnKeyDownListener listener = sf.get(); return listener; } catch (Exception e) { // TODO Auto-generated catch block return null; } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if (m_isInited) { m_actionBar.setSelectedNavigationItem(position); int tab = position + 1; m_viewModel.setCurrentTab("00" + tab); } } @Override public void onPageScrollStateChanged(int state) { } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { if (m_isInited) { Object tag = tab.getTag(); for (int i = 0; i < m_tabs.size(); i++) { if (m_tabs.get(i) == tag) { m_viewPager.setCurrentItem(i); int index = i + 1; m_viewModel.setCurrentTab("00" + index); break; } } } } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { } }