深入理解ViewPager

Viewpager的使用条件

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

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

所以不满足这两个条件最好不要使用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的源码。

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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,037评论 25 709
  • 作者:李旺成 时间:2016年5月3日 一、PagerAdapter介绍 先看效果图 PagerAdapter简介...
    diygreen阅读 83,307评论 38 309
  • ViewPager在开发中的使用频率非常的高,所以在此做个总结。主要包括以下几方面: ViewPager的简介和作...
    西瓜太郎123阅读 121,590评论 21 261
  • 1.红烧鱼 做法: 1、把宰杀干净的鱼打花刀的。 2、红烧鱼的刀法是竖切,鱼呈块状。先在油锅内煎一下,油适量不必太...
    安静baby阅读 3,658评论 0 0
  • 最优秀的作家都有一副辩证的灵活头脑,可以轻而易举地转换观点。他们既能看到正面,也能看到负面,还能看到所有不同程度的...
    雪波阅读 6,483评论 1 4

友情链接更多精彩内容