package com.m.ui.fragment; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.android.loader.BitmapLoader; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.os.Bundle; import android.os.Handler; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import com.astuetz.PagerSlidingTabStrip; import com.m.R; import com.m.common.utils.ActivityHelper; import com.m.common.utils.Logger; import com.m.support.Inject.ViewInject; import com.m.support.adapter.FragmentPagerAdapter; import com.m.ui.activity.BaseActivity; import com.m.ui.fragment.ATabTitlePagerFragment.TabTitlePagerBean; public abstract class ATabTitlePagerFragment<T extends TabTitlePagerBean> extends ABaseFragment implements OnPageChangeListener {// , IRefreshAfterLoadCache static final String TAG = ATabTitlePagerFragment.class.getSimpleName(); @ViewInject(idStr = "tabs") PagerSlidingTabStrip pagerTabs; @ViewInject(idStr = "pager") ViewPager viewPager; MyViewPagerAdapter mViewPagerAdapter; private ArrayList<T> mChanneList; private Map<String, ABaseFragment> fragments; private int selectedIndex = 0; private long lastChanneTime; private String lastPageName; @Override protected int inflateContentView() { return R.layout.ui_tabtitle_pager; } abstract protected ArrayList<T> getPageTitleBeans(); abstract protected String setFragmentTitle(); abstract protected ABaseFragment newFragment(T bean); abstract protected void replaceSelfInActivity(); protected void onPageStart(String beanTitle) { } protected void onPageEnd(String beanTitle) { } protected void onEvent(String eventId, String tag, long time) { } @Override protected void layoutInit(LayoutInflater inflater, final Bundle savedInstanceSate) { super.layoutInit(inflater, savedInstanceSate); setHasOptionsMenu(true); setTab(savedInstanceSate); } // @Override // public boolean refreshAfterLoadCache() { // ABaseFragment fragment = getCurrentFragment(); // // 如果正在刷新 // if (fragment != null && fragment instanceof ARefreshFragment) { // ARefreshFragment refreshFragment = (ARefreshFragment) fragment; // if (refreshFragment.isRefreshing()) // return true; // } // if (fragment != null && fragment instanceof IRefreshAfterLoadCache) { // Logger.w("ATab refreshAfterLoadCache , position = " + getViewPager().getCurrentItem()); // return ((IRefreshAfterLoadCache) fragment).refreshAfterLoadCache(); // } // else { // Logger.w("ATab refreshAfterLoadCache , fragment = null"); // } // // return false; // } @SuppressWarnings("unchecked") protected void setTab(final Bundle savedInstanceSate) { mHandler.postDelayed(new Runnable() { @Override public void run() { if (getActivity() == null) return; if (savedInstanceSate == null) { mChanneList = getPageTitleBeans(); String lastReadType = ActivityHelper.getInstance().getShareData("PagerLastPosition" + setFragmentTitle(), null); selectedIndex = 0; if (getArguments() != null) { lastReadType = null; selectedIndex = getArguments().getInt("index", 0); } if (!TextUtils.isEmpty(lastReadType)) { for (int i = 0; i < mChanneList.size(); i++) { TabTitlePagerBean bean = mChanneList.get(i); if (lastReadType.equals(bean.getType())) { selectedIndex = i; break; } } } } else { mChanneList = (ArrayList<T>) savedInstanceSate.getSerializable("channes"); selectedIndex = savedInstanceSate.getInt("selectedIndex"); } fragments = new HashMap<String, ABaseFragment>(); if (mChanneList == null) return; if (mChanneList.size() == 0) { findViewById(R.id.layoutEmpty).setVisibility(View.VISIBLE); findViewById(R.id.layoutContent).setVisibility(View.GONE); } else { for (int i = 0; i < mChanneList.size(); i++) { ABaseFragment fragment = (ABaseFragment) getActivity().getFragmentManager() .findFragmentByTag(mChanneList.get(i).getTitle() + setFragmentTitle()); if (fragment != null) fragments.put(mChanneList.get(i).getTitle() + setFragmentTitle(), fragment); } mViewPagerAdapter = new MyViewPagerAdapter(getFragmentManager()); // viewPager.setOffscreenPageLimit(mViewPagerAdapter.getCount()); viewPager.setOffscreenPageLimit(3); viewPager.setAdapter(mViewPagerAdapter); if (selectedIndex >= mViewPagerAdapter.getCount()) selectedIndex = 0; viewPager.setCurrentItem(selectedIndex); pagerTabs.setViewPager(viewPager); if (mViewPagerAdapter.getCount() <= 3) pagerTabs.setShouldExpand(true); pagerTabs.setOnPageChangeListener(ATabTitlePagerFragment.this); lastChanneTime = System.currentTimeMillis(); } if (mChanneList != null && TextUtils.isEmpty(lastPageName) && selectedIndex < mChanneList.size()) { lastPageName = mChanneList.get(selectedIndex).getTitle(); onPageStart(lastPageName); } // mHandler.postDelayed(new Runnable() { // // @Override // public void run() { // if (getActivity() != null) // refreshAfterLoadCache(); // } // // }, 250); } }, 270); } @Override public void onDestroy() { super.onDestroy(); try { ActivityHelper.getInstance().putShareData("PagerLastPosition" + setFragmentTitle(), mChanneList.get(viewPager.getCurrentItem()).getType()); destoryFragments(); } catch (Exception e) { e.printStackTrace(); } } public PagerSlidingTabStrip getTabStrip() { return pagerTabs; } private void destoryFragments() { if (getActivity() != null) { if (getActivity() instanceof BaseActivity) { BaseActivity mainActivity = (BaseActivity) getActivity(); if (mainActivity.mIsDestoryed()) return; } try { FragmentTransaction trs = getFragmentManager().beginTransaction(); Set<String> keySet = fragments.keySet(); for (String key : keySet) { if (fragments.get(key) != null) trs.remove(fragments.get(key)); } trs.commit(); } catch (RuntimeException e) { e.printStackTrace(); } } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); selectedIndex = viewPager.getCurrentItem(); outState.putSerializable("channes", mChanneList); outState.putInt("selectedIndex", selectedIndex); } class MyViewPagerAdapter extends FragmentPagerAdapter { public MyViewPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { ABaseFragment fragment = fragments.get(makeFragmentName(position)); if (fragment == null) { fragment = newFragment(mChanneList.get(position)); fragments.put(makeFragmentName(position), fragment); } return fragment; } @Override protected void freshUI(Fragment fragment) { } @Override public int getCount() { return mChanneList.size(); } @Override public CharSequence getPageTitle(int position) { return mChanneList.get(position).getTitle(); } @Override protected String makeFragmentName(int position) { return mChanneList.get(position).getTitle() + setFragmentTitle(); } } @Override public void onResume() { super.onResume(); if (mChanneList != null && TextUtils.isEmpty(lastPageName) && selectedIndex < mChanneList.size()) { lastPageName = mChanneList.get(selectedIndex).getTitle(); onPageStart(lastPageName); } if (ActivityHelper.getInstance().getBooleanShareData("ChanneSortHasChanged", false) || ActivityHelper.getInstance().getBooleanShareData("offlineChanneChanged", false)) { ActivityHelper.getInstance().putBooleanShareData("ChanneSortHasChanged", false); ActivityHelper.getInstance().putBooleanShareData("offlineChanneChanged", false); destoryFragments(); replaceSelfInActivity(); } } @Override public void onPause() { super.onPause(); if (!TextUtils.isEmpty(lastPageName)) { onPageEnd(lastPageName); lastPageName = null; } } @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int position) { if (!TextUtils.isEmpty(lastPageName)) onPageEnd(lastPageName); lastPageName = mChanneList.get(position).getTitle(); onPageStart(lastPageName); if (System.currentTimeMillis() - lastChanneTime > 30 * 1000) onEvent(mChanneList.get(selectedIndex).getType(), mChanneList.get(selectedIndex).getTitle(), System.currentTimeMillis() - lastChanneTime); lastChanneTime = System.currentTimeMillis(); selectedIndex = position; // refreshAfterLoadCache(); // 释放资源 mHandler.removeCallbacks(releaseFragmentRunnable); mHandler.postDelayed(releaseFragmentRunnable, 5 * 1000); // 刷新当前显示 mHandler.removeCallbacks(refreshFragmentRunnable); mHandler.postDelayed(refreshFragmentRunnable, 1000); } Runnable refreshFragmentRunnable = new Runnable() { @Override public void run() { Fragment fragment = fragments.get(mViewPagerAdapter.makeFragmentName(selectedIndex)); if (fragment != null) { Logger.w(String.format("刷新第%d个fragment的资源", selectedIndex)); BitmapLoader.getInstance().clearCache(); ((ARefreshFragment<Serializable, Serializable, View>) fragment).refreshUI(); } } }; Runnable releaseFragmentRunnable = new Runnable() { @Override public void run() { Logger.w(String.format("准备释放第%d个fragment的资源", selectedIndex + 1)); Logger.w(String.format("准备释放第%d个fragment的资源", selectedIndex - 1)); releaseFragment(selectedIndex + 1); releaseFragment(selectedIndex - 1); } }; public void releaseFragment(int position) { if (position < mChanneList.size() && position >= 0) { Fragment fragment = fragments.get(mViewPagerAdapter.makeFragmentName(position)); if (fragment != null) { Logger.w(String.format("释放第%d个fragment的资源", position)); ((ARefreshFragment<Serializable, Serializable, View>) fragment).releaseBitmap(); } else { Logger.e(String.format("释放的第%d个fragment不存在", position)); } } } Handler mHandler = new Handler() { }; public ViewPager getViewPager() { return viewPager; } public FragmentPagerAdapter getViewPagerAdapter() { return mViewPagerAdapter; } public ABaseFragment getCurrentFragment() { if (mViewPagerAdapter.getCount() < selectedIndex) return null; ABaseFragment fragment = fragments.get(mViewPagerAdapter.makeFragmentName(selectedIndex)); Logger.d(TAG, String.format("getCurrentFragment, position = %d, title = %s", selectedIndex, mViewPagerAdapter.makeFragmentName(selectedIndex))); return fragment; } public Fragment getFragment(String title) { if (fragments == null) return null; return fragments.get(title); } public Map<String, ABaseFragment> getFragments() { return fragments; } // @Override // public boolean onAcUnusedDoubleClicked() { // ABaseFragment fragment = getCurrentFragment(); // if (fragment != null && fragment instanceof IAcUnusedDoubleClickedHandler) { // ((IAcUnusedDoubleClickedHandler) fragment).onAcUnusedDoubleClicked(); // // Logger.w(mViewPagerAdapter.makeFragmentName(selectedIndex) + "双击了"); // // return true; // } // // return false; // } public static class TabTitlePagerBean implements Serializable { private static final long serialVersionUID = 3680682035685685311L; private String type; private String title; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } }