您的位置:首页 > 编程语言 > PHP开发

ViewPager+Fragment最优实现方案

2016-05-20 17:41 651 查看
ViewPager+Fragment最优实现方案:

一、viewpager+fragment的实现中PagerAdapter的实现方案:

1.介绍PagerAdapter:

PageAdapter 是 ViewPager 的支持者,ViewPager 将调用它来取得所需显示的页,

而 PageAdapter 也会在数据变化时,通知 ViewPager。这个类也是FragmentPagerAdapter

以及 FragmentStatePagerAdapter 的基类。如果继承自该类,至少需要实现

instantiateItem(), destroyItem(), getCount() 以及 isViewFromObject()。

2.少量几个fragment页面,并且不需要加载大量数据,继承自FragmentPagerAdapter实现适配器

—————————————————–日志分析-start:

//初始化之后只有头两个Fragment被创建

当前Fragment:IndiFragment{42a15558}: onCreateView

当前Fragment:IndiFragment{42a15558}: onActivityCreated

当前Fragment:IndiFragment{42a15c60}: onCreateView

当前Fragment:IndiFragment{42a15c60}: onActivityCreated

//右滑一下,创建了第三个Fragment的对象

当前Fragment:IndiFragment{42a16320}: onCreateView

当前Fragment:IndiFragment{42a16320}: onActivityCreated

//再左滑一下,第三个Fragment的布局被干掉,但是Fragment对象并没有销毁

当前Fragment:IndiFragment{42a16320}: onDestroyView

—————————————————–日志分析-end:

3.多个fragment并且需要加载数据,继承自FragmentStatePagerAdapter实现适配器

—————————————————–日志分析-start:

//初始化之后只有头两个Fragment被创建

当前Fragment:IndiFragment{42a15558}: onCreateView

当前Fragment:IndiFragment{42a15558}: onActivityCreated

当前Fragment:IndiFragment{42a15c60}: onCreateView

当前Fragment:IndiFragment{42a15c60}: onActivityCreated

//右滑一下,创建了第三个Fragment的对象

当前Fragment:IndiFragment{42a16320}: onCreateView

当前Fragment:IndiFragment{42a16320}: onActivityCreated

//再左滑一下,第三个Fragment的对象被彻底销毁

当前Fragment:IndiFragment{42a16320}: onDestroyView

当前Fragment:IndiFragment{427a4ba0}: onDestroy

—————————————————–日志分析-end:

总结:FragmentPagerAdapter和FragmentStatePagerAdapter的加载策略是一致的,

都是加载当前Fragment和前一个以及后一个,一共加载三个Fragment。不同之处在

于内存缓存的处理,FragmentPagerAdapter处理不显示的fragment只是不显示布局,

并没哟销毁fragment对象;而FragmentStatePagerAdapter处理不限的fragment则

是彻底销毁fragment对象。

FragmentPagerAdapter和FragmentStatePagerAdapter的使用区别参考:

http://www.cnblogs.com/lianghui66/p/3607091.html

http://blog.csdn.net/hknock/article/details/46741573

二、取消预加载方案:

其实Fragment中防止预加载主要是防止数据的预加载,Fragment中的VIew预加载是有好处的,

我们可以通过Fragment中的一个方法来达到预加载View 但是不加载数据,在Fragment显示的

时候才去加载数据。

参考:

http://www.bubuko.com/infodetail-535920.html

http://blog.csdn.net/maosidiaoxian/article/details/38300627

三、总结

1.Fragment个数少于3个,并且不需要加载数据:

适配器继承FragmentPagerAdapter,不需要做取消预加载的处理。

2.Fragment个数大于3个,并且需要加载数据,类似新闻客户端:

适配器继承FragmentStatePagerAdapter,销毁当前、前一个以及后一个fragment之外的fragment对象。

需要数据预加载:不做处理情况下,自动预加载前一个和后一个的数据

不需要数据预加载:fragment基类中重写setUserVisibleHint方法,那么所有fragment都只有在

可见情况下才会加载数据。

注意:通过对网易、头条的使用分析,他们的产品设计基本是没有数据预加载或者只预加载前后两页,但是最重要的是他们有本地和内存的缓存策略。所以实际开发中如果tab只有3个,那么数据的预加载是可有可无的。如果叶签过多的情况下就必须用预加载和缓存策略相结合来处理具体需求了。

源代码demo:

http://download.csdn.net/detail/u013168615/9527589

更多fragment学习内容参考:

http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650820216&idx=1&sn=64d0380fedf947c7adefc6d3eb722301&scene=23&srcid=0523Avr6W8UuVzqGIGQrLFUD#rd
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息