android fragmentstatepageradapter框架,Android 中 FragmentPagerAdapter 与 FragmentStatePagerAdapter的区别…

  • Post author:
  • Post category:其他


1、博文介绍

2、FragmentPagerAdapter中设置不让Fragment视图重新创建

c2686397f764

image.png

c2686397f764

image.png

FragmentPagerAdapter完整代码如下

/**

* 主页ViewPager适配器

* Created by _Smile on 2017/5/9.

*/

public class TabFragmentPagerAdapter extends FragmentPagerAdapter {

private FragmentManager mFragmentManager;

//保存每个Fragment的Tag,刷新页面的依据

protected SparseArray tags = new SparseArray<>();

//继承FragmentPagerAdapter类 ,并自定义的构造器

private List fragments;

public TabFragmentPagerAdapter(FragmentManager fm, List fragments) {

super(fm);

this.fragments =fragments;

mFragmentManager = fm;

}

@Override

public Fragment getItem(int position) {

return fragments.get(position);

}

@Override

public int getCount() {

return fragments.size();

}

@Override

public long getItemId(int position) {

return fragments.get(position).hashCode();

}

@Override

public int getItemPosition(Object object) {

Fragment fragment = (Fragment) object;

//如果Item对应的Tag存在,则不进行刷新

if (tags.indexOfValue(fragment.getTag()) > -1) {

return super.getItemPosition(object);

}

return POSITION_NONE;

}

@Override

public Object instantiateItem(ViewGroup container, int position) {

//得到缓存的fragment

Fragment fragment = (Fragment) super.instantiateItem(container, position);

String tag = fragment.getTag();

//保存每个Fragment的Tag

tags.put(position, tag);

return fragment;

}

//拿到指定位置的Fragment

public Fragment getFragmentByPosition(int position) {

return mFragmentManager.findFragmentByTag(tags.get(position));

}

public List getFragments(){

return mFragmentManager.getFragments();

}

//刷新指定位置的Fragment

public void notifyFragmentByPosition(int position) {

tags.removeAt(position);

notifyDataSetChanged();

}

@Override

public void destroyItem(ViewGroup container, int position, Object object) {

// super.destroyItem(container, position, object);

}

@Override

public void notifyDataSetChanged() {

super.notifyDataSetChanged();

}

}

Fragmenr和Activity使用代码如下

mFragments.add(mTab_01);

mFragments.add(mTab_02);

mFragments.add(mTab_03);

mAdapter = new TabFragmentPagerAdapter(getSupportFragmentManager(), mFragments);

mViewPager.setOffscreenPageLimit(mFragments.size());

//设置滑动监听器

mViewPager.clearOnPageChangeListeners();

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

@Override

public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

//滑动时 改变图标状态

@Override

public void onPageSelected(int position) {

int currentItem = mViewPager.getCurrentItem();

LogUtils.d(“当前currentItem:” + currentItem + “当前position:” + position);

}

@Override

public void onPageScrollStateChanged(int state) {

}

});

……

mViewPager.setAdapter(mAdapter);

mViewPager.setCurrentItem(0);

setSelect(0);