我们在使用Listview或者RecyclerView的时候从来都是从外部设置数据源。代码像这样`
public class MyAdapter<T> extends BaseAdapter {
private Context mContext;
private List<T> mLists;
public MyAdapter(Context c,List<T> list) {
mContext = c;
mLists =list;
}
}
而fragmentpageradapter如果也这样使用,在线上你可能会遇到莫名其妙的崩溃,这是由于我们没能够处理好fragment的生命周期。FragmentStatePagerAdapter很好的帮助我们实现了fragment的管理.`而google的示例中,也没有从外部传递fragment的数据
public abstract class BaseTabAdapter extends FragmentStatePagerAdapter {
public List<Fragment> mFragments;
protected int size = 0;
private List<String> mTitleList;
public BaseTabAdapter(FragmentManager fm, int size) {
this(fm, size, null);
}
public BaseTabAdapter(FragmentManager fm, int size, List<String> mTitleList) {
super(fm);
mFragments = new ArrayList<>(size);
this.size = size;
this.mTitleList = mTitleList;
}
@Override
public Fragment getItem(int position) {
while (mFragments.size() <= position) {
mFragments.add(null);
}
Fragment fragment = initItem(position);
mFragments.set(position,fragment);
return fragment;
}
protected abstract Fragment initItem(int position);
@Override
public int getCount() {
return size;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
while (mFragments.size() <= position) {
mFragments.add(null);
}
mFragments.set(position,fragment);
return fragment;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
super.destroyItem(container, position, object);
mFragments.set(position, null);
}
}
实际上activity如果因销毁重建,instantiateItem中会判断通过tag查找对应fragment,如果找不到在帮我们重建。我们应该注意提供给Fragment默认的构造方法就可以了,通过 (Fragment) super.instantiateItem(container, position)得到重建的fragment并在数组对应位置赋值 mFragments[position] = fragment,这样得到的实例才是正确的。
业务代码中我们只需要在内部提供fragment的构造器
public class MyAdapter extends BaseTabAdapter {
public MyAdapter(FragmentManager fm) {
super(fm, 2);
}
@Override
protected Fragment initItem(int position) {
Fragment fragment = null;
switch (position) {
case 0:
fragment = new AFragment();
break;
case 1:
fragment = new BFragment();
break;
}
return fragment;
}
}