问题
在进行Fragment的添加和删除时,适配器刷新之后发现并没有什么变化,这是为什么呢?
理解
FragmentPagerAdapter
适合少量的页面显示。该类每一个生成的Fragment对象都会储存在内存中,所以适合相对静态、页面少的情况,如果是页面多,且Fragment的处理相对动态(添加、删除等)时,使用FragmentStatePagerAdapter较为适合。
FragmentStatePagerAdapter
适合大量的页面显示,当页面处于不可见时,可能会被销毁,只保留该片段的保存状态。与FragmentPagerAdapter切换页面产生的大量开销对比,这允许了适配器保持与每个被访问页面相关联的更少的存储器。
分析
在切换页面时,FragmentPagerAdapter与FragmentStatePagerAdapter对于上上页(预加载默认1,所以取上上页)的处理是不相同的,FragmentPagerAdapter只是销毁对应Fragment的视图,而FragmentStatePagerAdapter则是把Fragment的实例和视图都销毁了。
当我们对页面进行动态处理时,添加(或删除)是对适配器所持有的list对象进行长度的变化,操作完之后就进行适配器的刷新,也就是notifyDataSetChanged方法,先看看该方法:
1 | //PagerAdapter.class |
1 | //ViewPager.class |
对FragmentPagerAdapter(或FragmentStatePagerAdapter)执行的方法大概进行注释一下,方便理解,
1 | //ViewPager.class |
Adapter.getItemPosition方法默认返回的是PagerAdapter.POSITION_UNCHANGED值,如果我们不重写getItemPosition方法,使其返回PagerAdapter.POSITION_NONE的话,那么默认是不操作destroyItem方法的,而在destroyItem方法中,FragmentPagerAdapter和FragmentStatePagerAdapter 对Fragment对象的操作也不一样,上面有说过,FragmentPagerAdapter是只销毁视图,FragmentStatePagerAdapter 是把实例和视图都销毁,就是在destroyItem方法实现的,贴代码:
1 | //FragmentPagerAdapter |
解决
根据上面的分析,在进行添加删除的时候,我采用了FragmentStatePagerAdapter的子类,进行方法的重写,主要是对该类的两个方法(instantiateItem和destroyItem)进行重写,替换父类的实现,代码如下:
1 | package com.voctex.adapter; |
结束语
在不断的看源码,查资料,调试程序中,终于是把该问题解决了,网上的资料都说得模棱两可,很多时候都得自己操刀,理解了才是自己的,特别是Fragment在FragmentManager中的mIndex值,有点坑,这里没拿出来说,以后有机会再补补。