package com.androidex.adapter; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentStatePagerAdapter; import android.view.ViewGroup; import com.androidex.utils.LogA; import java.util.List; /** * 该适配器适用于页面较多的情况: * 当第一次加载position对应的Fragment时,首先getItem()创建Fragment对象,不会缓存起来!!,再走生命周期:onCreateView -> onActivityCreate() -> onStart() * 当要销毁时adapter回调destoryItem: * 如果destoryItem正常完成,此时Fragment的生命周期是:onStop() -> onDestoryView()->onDestory(),!!!销毁Fragment对象; * 如果destoryItem未正常完成,则会缓存这个Fragment!!!(这个要注意); * <p> * 当需要再次使用的时候,通过instantiateItem(),获取缓存: * 如果之前正常destoryItem,缓存会是空的,此时会再getItem()创建Fragment对象,然后走生命周期,也就是第一次加载:onCreateView -> onActivityCreate() -> onStart * 如果之前destoryItem未正常完成,缓存里是有的,则继续使用缓存的Fragment,且什么都不做 * <p> * 当调用NotifyDataSetChanged时,如果getItemPosition()返回POSITION_NONE时, * adapter会调用回调instantiateItem(),获取对应的缓存Fragment,回调 destoryItem: * 如果destoryItem正常完成,此时Fragment的生命周期是:onStop() -> onDestoryView() -> onDestory(), * 然后再 onCreateView -> onActivityCreate -> onStart(); * <p> * 如果destoryItem未正常完成:缓存里是有对应的Fragment的,此时什么都不做 * <p> * # destoryItem 正常与未正常只的是真正调用了父类的destoryItem方法 */ public abstract class ExFragmentStatePagerAdapter<T> extends FragmentStatePagerAdapter { private List<T> mData; private FragmentActivity mFragmentActivity; private boolean mFragmentItemDataSetChangedEnable; private boolean mFragmentItemDestoryEnable = true; public ExFragmentStatePagerAdapter(FragmentActivity activity) { super(activity.getSupportFragmentManager()); mFragmentActivity = activity; } @Override public int getItemPosition(Object object) { if (LogA.isDebug()) LogA.d(getClass().getSimpleName(), "~~getItemPosition, obj = " + object.hashCode()); return mFragmentItemDataSetChangedEnable ? POSITION_NONE : POSITION_UNCHANGED; //return super.getItemPosition(object); //POSITION_UNCHANGED super 默认实现返回的是该值, //调用notifyDataSetChanged是不会回调getItem等方法进行刷新的,这里返回NONE表示item需要更新 } @Override public Fragment getItem(int position) { return createFragment(mFragmentActivity, position); } @Override public Object instantiateItem(ViewGroup container, int position) { Fragment fragment = (Fragment) super.instantiateItem(container, position); invalidateFragment(fragment, position); return fragment; } protected abstract Fragment createFragment(FragmentActivity activity, int position); protected abstract void invalidateFragment(Fragment fragment, int position); @Override public void destroyItem(ViewGroup container, int position, Object object) { if (LogA.isDebug()) LogA.d(getClass().getSimpleName(), "~~destroyItem pos=" + position + ", fragment=" + object.hashCode() + ", destory enable=" + mFragmentItemDestoryEnable); if (mFragmentItemDestoryEnable) super.destroyItem(container, position, object); } @Override public int getCount() { return mData == null ? 0 : mData.size(); } public void setData(List<T> data) { mData = data; } public T getDataItem(int position) { if (mData == null) return null; T t = null; try { t = mData.get(position); } catch (Exception e) { e.printStackTrace(); } return t; } public void setFragmentItemDataSetChangedEnable(boolean enable) { mFragmentItemDataSetChangedEnable = enable; } public void setFragmentItemDestoryEnable(boolean enable) { mFragmentItemDestoryEnable = enable; } }