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
一、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
相关文章推荐
- MySQL 优化
- Google排名优化的几个影响因素
- DB2优化(简易版)
- Mysql limit 优化,百万至千万级快速分页 复合索引的引用并应用于轻量级框架
- C#中尾递归的使用、优化及编译器优化
- 对优化Ruby on Rails性能的一些办法的探究
- 优化Ruby脚本效率实例分享
- Asp编码优化技巧
- 如何监测和优化OLAP数据库
- mysql -参数thread_cache_size优化方法 小结
- 深入学习SQL Server聚合函数算法优化技巧
- MySQL常见的底层优化操作教程及相关建议
- 详解mysql的limit经典用法及优化实例
- Android App开发中ViewPager组件的入门使用教程
- 数据库学习建议之提高数据库速度的十条建议
- oracle数据库sql的优化总结
- SQL语句性能优化(续)
- SQL语句优化提高数据库性能
- SQL优化经验总结
- SQL优化技巧指南