package com.hupu.games.adapter; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.PagerAdapter; import android.view.ViewGroup; import com.hupu.games.activity.HupuHomeActivity; import com.hupu.games.common.HuPuRes; import com.hupu.games.common.HupuLog; import com.hupu.games.data.LeaguesEntity; import com.hupu.games.fragment.BaseFragment; import com.hupu.games.fragment.DataFragment; import com.hupu.games.fragment.DiscoveryFragment; import com.hupu.games.fragment.FootballRankFragment; import com.hupu.games.fragment.BasketballGamesFragment; import com.hupu.games.fragment.NbaStandingFragment; import com.hupu.games.fragment.NewsFragment; import com.hupu.games.fragment.SoccerGamesFragment; import com.hupu.games.fragment.VideoFragment; import com.hupu.games.fragment.WebViewFragment; /** * 首页viewpager的adapter * * @author panyongjun * */ public class HomePageAdapter extends FragmentStatePagerAdapter { /** key是联赛名+tab 例如nba新闻就是:nba_news */ HashMap<String, BaseFragment> mMapFragments; /** 显示的模式,目前有NBA,篮球,足球,足球杯赛,浏览器模式 */ public final static int MODE_NBA = 0; /** 目前CBA只显示三个子tag 赛程 新闻 视频 */ public final static int MODE_BASKETBALL = 1; public final static int MODE_FOOTBALL = 2; public final static int MODE_CUP_CL = 3; public final static int MODE_BROWSER = 4; public final static int MODE_BROWSER_NAV = 5; public final static int MODE_DISCOVERY = 6; private final static int INDEX_GAME = 0; private final static int INDEX_NEWS = 1; private final static int INDEX_VIDEO = 2; private final static int INDEX_STANDINGS = 3; private final static int INDEX_NBA_DATA = 4; /** 当前页面的tab */ private String mCurTab; LinkedList<LeaguesEntity> mListLeagues; private ArrayList<String> mTitles; private ArrayList<String> mTabList; HupuHomeActivity mAct; public HomePageAdapter(HupuHomeActivity act, FragmentManager fm, LinkedList<LeaguesEntity> listLeagues) { super(fm); mAct = act; mTabList = new ArrayList<String>(); mMapFragments = new HashMap<String, BaseFragment>(); updateTitle(listLeagues,null); } /**更新顶部导航栏的标题*/ public void updateTitle(LinkedList<LeaguesEntity> listLeagues,String lastTitle) { mListLeagues = listLeagues; if (mTitles == null) mTitles = new ArrayList<String>(); else mTitles.clear(); int index=0; editedPos=0; for (LeaguesEntity entity : mListLeagues) { if(lastTitle!=null && lastTitle.equals(entity.name)) editedPos=index; // HupuLog.d("fb","updateTitle="+entity.name); mTitles.add(entity.name); mTabList.add(entity.show_default_tab); index++; } } int editedPos; /**获取编辑后页面的索引*/ public int getEditedPagePos() { return editedPos; } @Override public Fragment getItem(int index) { // HupuLog.d("fb","Fragment=" + index); return findFragment(index, mCurTab); } @Override public int getCount() { if (mTitles != null) return mTitles.size(); return 0; } /**顶部导航栏的标题*/ @Override public CharSequence getPageTitle(int position) { if (mTitles != null) return mTitles.get(position); return ""; } /**根据下标获取该Fragment所对应的模板*/ public String getTemplate(int position) { if (mListLeagues != null){ try { return mListLeagues.get(position).template; } catch (Exception e) { // TODO: handle exception } } return ""; } String cnTag; boolean isWebStanding; String curTag; int curLid; /**初始化创建Fragment所需要的参数*/ private void initParam(LeaguesEntity en) { cnTag = en.name; curTag = en.en; curLid = en.lid; if ("web".equalsIgnoreCase(en.showStandings)) isWebStanding = true; else isWebStanding = false; } /** * 当tab是Data是需要判断该页面是否有Data页面 或者是webview的URL连接 * */ private boolean isAvailibleTag(String tab, LeaguesEntity entity) { if (tab.equals("data") && !entity.template.equals("nba")) return false; if (entity.template.equals(HuPuRes.TEMPLATE_BROWSER) || entity.template.equals(HuPuRes.TEMPLATE_BROWSER_NAV)) { if (!tab.startsWith("http")) return false; } return true; } private BaseFragment findFragment(int pos, String tab) { BaseFragment fragment = null; LeaguesEntity entity = mListLeagues.get(pos); if(entity.template.equals(HuPuRes.TEMPLATE_DISCOVERY)) tab=""; else if (tab == null ||"".equals(tab)||!isAvailibleTag(tab, entity)) { tab = entity.show_default_tab; } if (mCurTab == null) { mCurTab = tab; } String key = entity.en + "_" + tab; // HupuLog.d("fb","findFragment key="+key); fragment = mMapFragments.get(key); // if(fragment!=null) // HupuLog.d("fb","findFragment !"); if (fragment == null) { initParam(entity); fragment = buildNewFragment(pos, tab); if (fragment == null) fragment = buildNewFragment(pos, tab = entity.show_default_tab); mMapFragments.put(key, fragment); } else { checkParam(fragment, tab); } // HupuLog.d("fb","findFragment index="+pos+" tab="+tab); mTabList.set(pos, tab); return fragment; } private void checkParam(BaseFragment fragment, String tab) { if (fragment instanceof DataFragment) { int index = getIndexByTab(tab); DataFragment fragmentDatas = (DataFragment) fragment; if (index == INDEX_NBA_DATA) fragmentDatas.setUrl(HuPuRes.BASE_URL + "nba/getPlayerData?client=" + mAct.getParam()); else if (index == INDEX_STANDINGS) { if (fragmentDatas.mode == MODE_NBA) fragmentDatas.setUrl(HuPuRes.BASE_URL + curTag + "/getStandings?client=" + mAct.getParam() + "&type=web"); else if (fragmentDatas.mode == MODE_BASKETBALL) fragmentDatas.setUrl(HuPuRes.BASE_URL + "cba/getStandings?client=" + mAct.getParam()); } } } private int getIndexByTab(String tab) { if (HuPuRes.TAB_GAMES.equals(tab)) return INDEX_GAME; else if (HuPuRes.TAB_NEWS.equals(tab)) return INDEX_NEWS; else if (HuPuRes.TAB_VIDEO.equals(tab)) return INDEX_VIDEO; else if (HuPuRes.TAB_RANKS.equals(tab)) { return INDEX_STANDINGS; } else if (HuPuRes.TAB_DATA.equals(tab)) return INDEX_NBA_DATA; return 0; } private BaseFragment buildNewFragment(int pos, String tab) { String template = getTemplate(pos); BaseFragment fragment = null; int mode = -1; int index = 0; if (HuPuRes.TEMPLATE_SOCCER_LEAGUE.equals(template)) { mode = MODE_FOOTBALL; } else if (HuPuRes.TEMPLATE_SOCCER_CUP_LEAGUE.equals(template)) { mode = MODE_CUP_CL; } else if (HuPuRes.TEMPLATE_NBA.equals(template)) { mode = MODE_NBA; } else if (HuPuRes.TEMPLATE_CBA.equals(template)) mode = MODE_BASKETBALL; else if (HuPuRes.TEMPLATE_BROWSER.equals(template)) { mode = MODE_BROWSER; } else if (HuPuRes.TEMPLATE_BROWSER_NAV.equals(template)) { mode = MODE_BROWSER_NAV; } else if (HuPuRes.TEMPLATE_DISCOVERY.equals(template)) { DiscoveryFragment df = new DiscoveryFragment(); df.setData(mListLeagues.get(pos).mDiscoverList); return df; } if (mode == MODE_DISCOVERY || mode == MODE_BROWSER) { WebViewFragment webviewFragment = new WebViewFragment(mode); webviewFragment.entry(curTag); return webviewFragment; } index = getIndexByTab(tab); Bundle bundle = new Bundle(); bundle.putString("tag", curTag); bundle.putInt("lid", curLid); bundle.putInt("mode", mode); switch (index) { case INDEX_GAME: // if ((initIndicator & 0x1) == 0) { if (mode == MODE_NBA || mode == MODE_BASKETBALL) { fragment = new BasketballGamesFragment(); fragment.setArguments(bundle); } else if (mode == MODE_FOOTBALL || mode == MODE_CUP_CL) { fragment = new SoccerGamesFragment(); fragment.setArguments(bundle); } break; case INDEX_NEWS: fragment = new NewsFragment(); bundle.putString("cnTag", cnTag); fragment.setArguments(bundle); break; case INDEX_VIDEO: fragment = new VideoFragment(); fragment.setArguments(bundle); break; case INDEX_STANDINGS: if (isWebStanding) { // web页面模式 会和数据页面共用,so 要重新 new 不然会无反应 // if (dataFragment == null) DataFragment fragmentDatas = new DataFragment(); fragment = fragmentDatas; fragmentDatas.setUrl(HuPuRes.BASE_URL + curTag + "/getStandings?client=" + mAct.getParam() + "&type=web"); } else { if (mode == MODE_NBA) { fragment = new NbaStandingFragment(); } else if (mode == MODE_BASKETBALL) { DataFragment mFragmentDatas = new DataFragment(); fragment = mFragmentDatas; mFragmentDatas.setUrl(HuPuRes.BASE_URL + "cba/getStandings?client=" + mAct.getParam()); } else { FootballRankFragment mFragmentSoccerStanding = new FootballRankFragment( curTag); fragment = mFragmentSoccerStanding; } } fragment.setArguments(bundle); break; case INDEX_NBA_DATA: DataFragment fragmentDatas = new DataFragment(); fragmentDatas.setUrl(HuPuRes.BASE_URL + "nba/getPlayerData?client=" + mAct.getParam()); fragment = fragmentDatas; fragment.setArguments(bundle); break; } return fragment; } public void clear() { } public BaseFragment getFragment(String league, String tab) { return mMapFragments.get(league + "_" + tab); } /**点击底部tab切换*/ public void clickTab(int index, String tab,boolean bNotify) { mCurTab = tab; mTabList.set(index, tab); // HupuLog.d("fb","clickTab tab="+mCurTab); notifyDataSetChanged(); } /**点击顶部tab或滑动页面切换*/ public void updateCurTab(int index) { String tab = mTabList.get(index); if(tab!=null&&!tab.equals("")) mCurTab=tab; // HupuLog.d("fb","update tab="+mCurTab); } public String getCurTab() { return mCurTab; } public String getTabByIndex(int index) { return mTabList.get(index); } @Override public Object instantiateItem(ViewGroup container, int position) { return super.instantiateItem(container, position); } @Override public int getItemPosition(Object object) { return PagerAdapter.POSITION_NONE; } }