首先加上一个连接,http://www.cnblogs.com/lianghui66/p/3607091.html在这篇文章中对其中的关系有详细的讲解,可是我以为对于我遇到的问题仍是本身写出整个解决流程是比较好的。html
首先要明白一个问题,ViewPager会缓存两个页面的信息,可是在使用instantiateItem()方法加载页面时会加载当前Tab页面左右两边的页面,便是加载了3个页面。在使用缓存时只缓存相邻的2个。android
通常使用FragmentStatePagerAdapter时为了更好的解决在调用notifyDataSetChanged()方法时能有刷新界面的效果。缓存
根据我本身在项目中的测试结果看,当调用notifyDataSetChanged()方法以后,大体流程为:性能
在我我的看来若是对整个生命周期比较熟悉以后是能够继承至PagerAdapter,重写其中的方法,那么就能够避免以后的程序出现各类其它的错误。固然在继承FragmentStatePagerAdapter以后应该查看FragmentStatePagerAdapter类里的方法,那么就能够避免重写多余的代码,由于在这个类中好多方法都已通过处理,只有在肯定里面的方法处理流程不是本身所须要的时候才须要重写其方法,否则仍是用FragmentStatePagerAdapter类里的方法比较好。好比:destroyItem()方法,自己已经对流程判断和删除操做作了很好的处理,在不符合本身的操做流程时再去重写方法。instantiateItem()方法也已对加载Fragment作了很好的处理。测试
在我本身的程序里使用了TabPageIndicator这个第三方类,其绑定了ViewPager,其中ViewPager全部的功能在这个类中都有。下面是对TabPageIndicator的简单了解。优化
其属于第三方ViewPagerIndicator包下的一个类,在此类中将ViewPager中的方法重写了一些,其Tab展现更加灵活,具体用法网上不少。其中也有notifyDataSetChanged方法,在这个方法里也会从新刷新界面,这时就要注意与ViewPager是否有冲突,由于二者既然绑定在一块儿,那么在加载时是会加载两遍的,(这一点我以为一点也很差,这或许是有好处就要牺牲掉一些性能吧。)ui
总结:htm
重写getItemPosition方法时会更据其方法返回的参数肯定怎样调用,若是是POSITION_UNCHANGED,那么就代表其页面已经加载不会再从新加载的,只有是POSITION_NONE才会从新加载。blog
destroyItem会删除当前页面继承
instantiteItem方法会加载左右两边的页面,加上自身共是3个页面。
在重写方法时注意里面的super这是会调到父类中的,注意在调到父类中的方法时其逻辑是不是本身想要的。
我的感悟:
网上的第三方包不少,用起来也很方便,可是在用的时候其逻辑结构每每是不清楚的,那么在以后的代码升级优化时每每会跟android系统的调用起冲突的,要想用时没有后顾之忧,只有在彻底了解各类方法调用的生命周期时才能运用自如,不过到了那种程度的大神估计是不屑用第三方的包吧,可是像处于咱们这种迷糊阶段的屁民每每就是蛋疼了,哈哈哈哈哈哈