深刻理解ViewPager

Viewpager的使用条件

  1. 多个Fragment滑动切换
  2. 多个Fragment的展现高度一致

在项目中常常遇到ScrollView嵌套ViewPager的作法,多个Fragment若是高度不一致,却强行使用ViewPager,就须要许多其余兼容代码来完成这个需求,有些得不偿失。java

因此不知足这两个条件最好不要使用Viewpager,此外Fragment一旦onAttach到Context,在没有及时清理掉的状况下,会随着Context的生命周期进行数据恢复,这个机制在不少状况下看似无害,不过在实际项目开发过程当中会形成许多没必要要的内存浪费。网络

Tips: 刷新界面,须要新建一个新的Fragment,但是FragmentManager会经过反射直接生成一个Fragment保存到内存中
1)无论这个反射生成的实例直接从新建立Fragment就会形成资源浪费,并且在OnCreatView()若是有异步操做就会带来许多其余问题
2)但若是经过FragmentManager的fragmentManager.findFragmentByTag(name)查看是否存在Fragment实例的话,再使用该FragmentonAttach到Context中,那么不少生命周期方法(如OnCreate())也不会再次调用异步

Viewpager如何添加子View

在看完Viewpager源码以后,产生了一个疑惑:全篇看不到是如何添加子View的,仅仅有方法addNewItem,难道不须要ViewPager来添加? 随后查看了PagerAdapter的源码。ide

public abstract class FragmentPagerAdapter extends PagerAdapter {
   
    public abstract Fragment getItem(int position);

    @Override
    public void startUpdate(ViewGroup container) { }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {}

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

    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {}

    @Override
    public void finishUpdate(ViewGroup container) {}

    @Override
    public boolean isViewFromObject(View view, Object object) {}

    @Override
    public Parcelable saveState() {}

    @Override
    public void restoreState(Parcelable state, ClassLoader loader) {}

    public long getItemId(int position) {}
}

依旧没有addView的踪影。那还有谁能来管理ViewPager动态地添加View呢?
琢磨了半天,忽然想到,还有一种可能性那就是“FragmentManager”,随后我看到了方法moveToState(Fragment f, int newState, int transit, int transitionStyle, boolean keepActive),看到这我恍然大悟,以前也看了不少网络上的文章对Fragment的源码进行解析,但是对于FragmentManager文章尚未认真地好好了解过,因此致使了对Framgent使用的误解和误用。
如今看来,能够完整地理解ViewPager的机制了:工具

  1. 经过ViewPager的setAdapter方法,ViewPager有了一个管理子View工具PagerAdapter
  2. PagerAdapter经过实现类的instantiateItem(ViewGroup container, int position)方法来建立一个Fragment,
  3. FragmentManager在合适的时机(state==CREATED)调用container.addView(f.mView)
相关文章
相关标签/搜索