关于ViewPager、PagerAdapter、FragmentStatePagerAdapter

首先加上一个链接,http://www.cnblogs.com/lianghui66/p/3607091.html在这篇文章中对其中的关系有详细的讲解,但是我觉得对于我遇到的问题还是自己写出整个解决流程是比较好的。

首先要明白一个问题,ViewPager会缓存两个页面的信息,但是在使用instantiateItem()方法加载页面时会加载当前Tab页面左右两边的页面,即是加载了3个页面。在使用缓存时只缓存相邻的2个。

一般使用FragmentStatePagerAdapter时为了更好的解决在调用notifyDataSetChanged()方法时能有刷新界面的效果。

根据我自己在项目中的测试结果看,当调用notifyDataSetChanged()方法之后,大致流程为:

关于ViewPager、PagerAdapter、FragmentStatePagerAdapter

在我个人看来如果对整个生命周期比较熟悉之后是可以继承至PagerAdapter,重写其中的方法,那么就可以避免之后的程序出现各种其它的错误。当然在继承FragmentStatePagerAdapter之后应该查看FragmentStatePagerAdapter类里的方法,那么就可以避免重写多余的代码,因为在这个类中好多方法都已经过处理,只有在确定里面的方法处理流程不是自己所需要的时候才需要重写其方法,不然还是用FragmentStatePagerAdapter类里的方法比较好。比如:destroyItem()方法,本身已经对流程判断和删除操作做了很好的处理,在不符合自己的操作流程时再去重写方法。instantiateItem()方法也已对加载Fragment做了很好的处理。

在我自己的程序里使用了TabPageIndicator这个第三方类,其绑定了ViewPager,其中ViewPager所有的功能在这个类中都有。下面是对TabPageIndicator的简单了解。

 其属于第三方ViewPagerIndicator包下的一个类,在此类中将ViewPager中的方法重写了一些,其Tab展示更加灵活,具体用法网上很多。其中也有notifyDataSetChanged方法,在这个方法里也会重新刷新界面,这时就要注意与ViewPager是否有冲突,因为两者既然绑定在一起,那么在加载时是会加载两遍的,(这一点我觉得一点也不好,这或许是有好处就要牺牲掉一些性能吧。)

总结:

  1. 重写getItemPosition方法时会更据其方法返回的参数确定怎样调用,如果是POSITION_UNCHANGED,那么就表明其页面已经加载不会再重新加载的,只有是POSITION_NONE才会重新加载。

  2. destroyItem会删除当前页面

  3. instantiteItem方法会加载左右两边的页面,加上自身共是3个页面。

  4. 在重写方法时注意里面的super这是会调到父类中的,注意在调到父类中的方法时其逻辑是否是自己想要的。

     

个人感悟:

网上的第三方包很多,用起来也很方便,但是在用的时候其逻辑结构往往是不清楚的,那么在之后的代码升级优化时往往会跟android系统的调用起冲突的,要想用时没有后顾之忧,只有在完全了解各种方法调用的生命周期时才能运用自如,不过到了那种程度的大神估计是不屑用第三方的包吧,但是像处于我们这种迷糊阶段的屁民往往就是蛋疼了,哈哈哈哈哈哈

你可能感兴趣的:(关于ViewPager、PagerAdapter、FragmentStatePagerAdapter)