package org.aisen.wen.ui.fragment; 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.PagerAdapter; import android.support.v4.view.ViewPager; import android.text.TextUtils; import android.view.View; import org.aisen.wen.R; import org.aisen.wen.R2; import org.aisen.wen.base.GlobalContext; import org.aisen.wen.support.bean.TabItem; import org.aisen.wen.support.utils.Logger; import org.aisen.wen.support.utils.SharedPreferencesUtils; import org.aisen.wen.ui.activity.BaseActivity; import org.aisen.wen.ui.adapter.FragmentPagerAdapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import butterknife.BindView; /** * 维护一个ViewPager的Fragemnt * * Created by wangdan on 15/12/22. */ public abstract class ATabsFragment<T extends TabItem> extends ABaseFragment implements ViewPager.OnPageChangeListener { static final String TAG = "AFragment-Tabs"; public static final String SET_INDEX = "org.aisen.android.ui.SET_INDEX";// 默认选择第几个 @BindView(R2.id.viewPager) ViewPager mViewPager; FragmentPagerAdapter mInnerAdapter; ArrayList<T> mItems; Map<String, Fragment> fragments; int mCurrentPosition = 0; private boolean isRetainFragments = false;// 如果系统先调用onSaveInstanceState方法,说明添加的Fragments是需要保留的 @Override public int setLayoutId() { return R.layout.comm_ui_tabs; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mCurrentPosition = mViewPager.getCurrentItem(); outState.putSerializable("items", mItems); outState.putInt("current", mCurrentPosition); isRetainFragments = true; } @Override public void bindView(View contentView, final Bundle savedInstanceState) { super.bindView(contentView, savedInstanceState); mItems = savedInstanceState == null ? generateTabs() : (ArrayList<T>) savedInstanceState.getSerializable("items"); mCurrentPosition = savedInstanceState == null ? 0 : savedInstanceState.getInt("current"); if (delayTabInit() == 0) { setTabInit(savedInstanceState); } else { new Handler().postDelayed(new Runnable() { @Override public void run() { setTabInit(savedInstanceState); } }, delayTabInit()); } } protected void setTabInit(final Bundle savedInstanceSate) { if (getActivity() == null) { return; } else if (getActivity() instanceof BaseActivity) { if (((BaseActivity) getActivity()).isDestory()) { return; } } if (savedInstanceSate == null) { if (getArguments() != null && getArguments().containsKey(SET_INDEX)) { mCurrentPosition = Integer.parseInt(getArguments().getSerializable(SET_INDEX).toString()); } else { if (configLastPositionKey() != null) { // 记录了最后阅读的标签 String type = SharedPreferencesUtils.getShareData(GlobalContext.getInstance(), "PagerLastPosition" + configLastPositionKey(), ""); if (!TextUtils.isEmpty(type)) { for (int i = 0; i < mItems.size(); i++) { TabItem item = mItems.get(i); if (type.equals(item.getType())) { mCurrentPosition = i; break; } } } } } } Logger.d(TAG, "CurrentPosition " + mCurrentPosition); fragments = new HashMap<>(); // 初始化的时候,移除一下Fragment if (savedInstanceSate == null) { for (int i = 0; i < mItems.size(); i++) { Fragment fragment = getActivity().getFragmentManager().findFragmentByTag(makeFragmentName(i)); if (fragment != null) { getActivity().getFragmentManager().beginTransaction() .remove(fragment).commit(); } } } setupViewPager(savedInstanceSate); } protected void setupViewPager(final Bundle savedInstanceSate) { mInnerAdapter = new InnerAdapter(getFragmentManager()); mViewPager.setOffscreenPageLimit(0); mViewPager.setAdapter(mInnerAdapter); if (mCurrentPosition >= mInnerAdapter.getCount()) mCurrentPosition = 0; mViewPager.setCurrentItem(mCurrentPosition); mViewPager.addOnPageChangeListener(this); } protected void destoryFragments() { if (getActivity() != null) { if (getActivity() instanceof BaseActivity) { BaseActivity mainActivity = (BaseActivity) getActivity(); if (mainActivity.isDestory()) 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)); Logger.d(TAG, "remove fragment , key = " + key); } } trs.commit(); } catch (Throwable e) { Logger.printExc(getClass(), e); } } } @Override public void onPageScrolled(int i, float v, int i2) { } @Override public void onPageSelected(int position) { mCurrentPosition = position; if (configLastPositionKey() != null) { SharedPreferencesUtils.putShareData(GlobalContext.getInstance(), "PagerLastPosition" + configLastPositionKey(), mItems.get(position).getType()); } // 查看是否需要拉取数据 Fragment fragment = getCurrentFragment(); if (fragment instanceof ITabInitData) { ((ITabInitData) fragment).onTabRequestData(); } } @Override public void onPageScrollStateChanged(int position) { } public String makeFragmentName(int position) { return mItems.get(position).getTitle(); } public List<T> getTabItems() { return mItems; } public PagerAdapter getPageAdapter() { return mInnerAdapter; } // 是否保留最后阅读的标签 protected String configLastPositionKey() { return null; } /** * 标签页,标签不能重复 * * @return */ abstract protected ArrayList<T> generateTabs(); abstract protected Fragment newFragment(T bean); // 延迟一点初始化tabs,用于在首页切换菜单的时候,太多的tab页导致有点点卡顿 protected int delayTabInit() { return 0; } @Override public void onDestroy() { try { if (!isRetainFragments) { destoryFragments(); } } catch (Exception e) { e.printStackTrace(); } super.onDestroy(); } public Fragment getCurrentFragment() { if (mViewPager == null || mInnerAdapter == null || mInnerAdapter.getCount() < mCurrentPosition) return null; return fragments.get(makeFragmentName(mCurrentPosition)); } public Fragment getFragment(String tabTitle) { if (fragments == null || TextUtils.isEmpty(tabTitle)) return null; for (int i = 0; i < mItems.size(); i++) { if (tabTitle.equals(mItems.get(i).getTitle())) { return fragments.get(makeFragmentName(i)); } } return null; } public Fragment getFragment(int index) { if (mItems.size() > index) { return fragments.get(makeFragmentName(index)); } return null; } public Map<String, Fragment> getFragments() { return fragments; } public ViewPager getViewPager() { return mViewPager; } class InnerAdapter extends FragmentPagerAdapter { public InnerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { Fragment fragment = fragments.get(makeFragmentName(position)); if (fragment == null) { fragment = newFragment(mItems.get(position)); fragments.put(makeFragmentName(position), fragment); } return fragment; } @Override protected void freshUI(int position, Fragment fragment) { super.freshUI(position, fragment); if (!fragments.containsValue(fragment)) { fragments.put(makeFragmentName(position), fragment); } } @Override public int getCount() { return mItems.size(); } @Override public CharSequence getPageTitle(int position) { return mItems.get(position).getTitle(); } @Override protected String makeFragmentName(int position) { return ATabsFragment.this.makeFragmentName(position); } } // 这个接口用于多页面时,只有当前的页面才加载数据,其他不显示的页面暂缓加载 // 当每次onPagerSelected的时候,再调用这个接口初始化数据 public interface ITabInitData { void onTabRequestData(); } }