ViewPager

是负责翻页的一个View,准确的说是一个ViewGroup,包含多个View页,在手指横向滑动屏蔽时,其负责对View进行切换。为了生成这些View页,需要提供一个PagerAdapter来进行数据绑定以及生成最终的View页。

1、setAdapter

ViewPager通过setAdapter()来建立与PagerAdapter的联系。这个联系是双向的,一方面,ViewPager会拥有PagerAdapter对象,从而可以在需要时调用PagerAdapter的方法,另一方面,ViewPager会在setAdapter时,调用PagerAdapter的registerDataSetObserver()方法,成为一个PagerObserver对象,从而在PagerAdapter有所需要时(如notifyDataSetChanged()或notifyDataSetInvalidated()时),可以调用Observer的onChanged()或onInvalidated()方法,从而实现PagerAdapter向ViewPager方向发送信息。

2、dataSetChanged

在PagerObserver.onChanged(),以及PagerObserver.onInvalidate()中被调用。因此当PagerAdapter.notifyDataSetChanged()被触发时,ViewPager.dataSetChanged()也会被触发。该函数将使用getItemPosition()的返回值来进行判断,如果为POSITION_UNCHANGED,则什么都不做,如果为POSITION_NONE,则调用PagerAdapter.destoyItem()来去掉该对象,并设置为需要刷新(needPopulate=true),以便触发PagerAdapter.instantiateItem()来生成新的对象。

PagerAdapter

是ViewPager的支持都,ViewPager将调用它来取得所需显示的页,而PageAdapter也会在数据变化时,通知ViewPager。这个类也是FragmentPagerAdapter以及FragmentStatePagerAdapter的基类。如果继承该类,至少需要实现instantiateItem(), destroyItem(), getCount()以及isViewFromObject()

1、getItemPosition

(1)该函数用以返回给定对象的位置,给定对象是由instantiateItem()的返回值。

(2)在ViewPager.dataSetChanged()中将对该函数的返回值进行判断,以决定是否最终触发PageAdapter.instantiateItem()函数。

(3)在PageAdapter中实现是直接传回POSITION_UNCHANGED。如果该函数不被重载,则会一直返回POSITION_UNCHANGED,从而导致ViewPager.dataSetChanged()被调用时,认为不必触发PagerAdapter.instantiateItem()。

2、instantiateItem

在每次ViewPager需要一个用来显示Object的时候,该函数都会被ViewPager.addNewItem()调用。

3、notifyDataSetChanged()

在数据集发生变化的时候,一般Activity会调用PagerAdapter.notifyDataSetChanged(),以通知PagerAdapter,而PagerAdapter则会通知在自己这里注册过的所有DataSetObserver。其中之一就是在ViewPager.setAdapter()中注册过的PageObserver。PageObserver则进而调用ViewPager.dataSetChanged(),从而导致ViewPager开始触发更新其内含View的操作。

FragmentPagerAdapter

相比通用的PagerAdapter,该类更专注于每一页均为Fragment的情况。该类内的每一个生成的Fragment都将保存在内存之中,因此适用于那些相对静态的页,数量也比较少的那种,如果需要处理有很多页,并且数据动态性较大、占用内存较多的情况,应该使用FragmentStatePagerAdapter。FragmentPagerAdapter重载实现了几个必须的函数,我们只需要实现getCount()即可,另外,由于FragmentPagerAdapter.instantiateItem()的实现中,调用了一个新增的虚函数getItem(),因此,我们还需要实现一个getItem()。

1、getItem

(1)该类中新增的一个虚函数。函数的目的为生成新的Fragment对象。在需要时,该函数将被instantiateItem()所调用。

(2)如果需要向Fragment对象传递相对静态的数据时,我们一般通过Fragment.setArguments来进行,这部分代码应当放到getItem()。它们只会在新生成Fragment对象时执行一遍。

(3)如果需要生成Fragment对象后,将数据集里面一些动态的数据传递给该Fragment,那么,这部分代码不适合放到getItem()中。因为当数据集发生变化时,往往对应的Fragment已经生成,如果传递数据部分代码放到了getItem()中,这部分代码将不会被调用。

2、instantiateItem

(1)函数中判断一下要生成的Fragment是否已经生成过,如果生成过了,就使用旧的,旧的将被Fragment.attach(),如果没有,就调用getItem()生成一个新的对象将被FragmentTransation.add()

(2)FragmentPaperAdapter会将所有生成的Fragment对象通过FragmentManager保存起来备用,以后需要该Fragment时,都会从FragmentManager读取,而不会再次调用getItem()方法。

(3)如果需要生成Fragment对象后,将数据集中的一些数据传递给Fragment, 这部分代码应该放到这个函数的重载里。在我们继承的子类中,重载该函数,并调用FragmentPagerAdapter.instantiateItem()取得该函数返回的Fragment对象,然后,我们使用Fragment对象中对应的方法,将数据传递过去,然后返回该对象。

3、destroyItem

该函数被调用后,会对Fragment进行FragmentTransaction.detach()。这里不是remove(),只是detach(),因此Fragment还在FragmentManager管理中,Fragment所占用的资源不会被释放。

FragmentStatePagerAdapter

该PagerAdapter的实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源。而在页面需要显示时,生成新的页面(就像ListView的实现一样)。这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存。

1、getItem

(1)该类中新增的虚函数

(2)函数的目的为生成新的Fragment对象。

(3)Fragment.setArguments()这种只会在新建Fragment时执行一次的参数传递代码,可以入在这里。

2、instantiateItem

(1)除非碰到FragmentManager刚好从SavedState中恢复了对应的Fragment的情况外,该函数将调用getItem()函数,生成新的Fragment对象,新的对象将被FragmentTransaction.add().

3、destroyItem

将Fragment移除,即调用FragmentTransaction.remove(),并释放其资源。

ViewPager PagerAdapter相关推荐

  1. ViewPager PagerAdapter未更新视图

    我正在使用兼容性库中的ViewPager. 我已经巧妙地让它显示了几个我可以翻阅的视图. 但是,我很难弄清楚如何使用一组新视图更新ViewPager. 我已经尝试了各种各样的事情,比如调用mAdapt ...

  2. 动态更新ViewPager?

    本文翻译自:Update ViewPager dynamically? I can't update the content in ViewPager. 我无法更新ViewPager中的内容. Wha ...

  3. Android ViewPager指示器

    一个values文件 attrs_universal_indicator.xml文件 <?xml version="1.0" encoding="utf-8&quo ...

  4. ViewPager添加小圆点

    ViewPager添加小圆点很简单,但是如果是网络图片可能就不太好做了,所以我这里给出一种方法,当然你也可以用其他的 1.主界面xml <?xml version="1.0" ...

  5. ViewPager 实现 Galler 效果, 中间大图显示,两边小图展示

    正常情况下, ViewPager 一页只能显示一项数据, 但是我们常常看到网上,特别是电视机顶盒的首页经常出现中间大图显示两端也都露出一点来,这种效果怎么实现呢?先上一张效果图: 大家第一眼肯定想到了 ...

  6. Android开源项目分类汇总-转载

    太长了,还是转载吧... 今天在看博客的时候,无意中发现了@Trinea在GitHub上的一个项目Android开源项目分类汇总,由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有 ...

  7. Android开源项目分类汇总[转]

    Android开源项目分类汇总 如果你也对开源实现库的实现原理感兴趣,欢迎 Star 和 Fork Android优秀开源项目实现原理解析 欢迎加入 QQ 交流群:383537512(入群理由需要填写 ...

  8. Android开源项目第二篇——工具库篇

    本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍经常使用的开发库,包含依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本号向低版本号 ...

  9. Android开源工具库

     一.依赖注入DI 通过依赖注入降低View.服务.资源简化初始化,事件绑定等反复繁琐工作 1. AndroidAnnotations(Code Diet) android高速开发框架 项目地址: ...

最新文章

  1. php先分组后排序,PHP数组分组排序实例代码
  2. 计算机网络:分组交换
  3. 2017前端面试题之综合篇(1)
  4. java中io与nio复制文件性能对比
  5. Android 开发工具类 02_DensityUtils
  6. Android APK的加固方法
  7. 实时OLAP分析利器Druid介绍
  8. Beetlex之tcp/tls服务压测工具
  9. matlab如何实现降维,matlab怎么把矩阵降维
  10. 信息学奥赛一本通 1839:【05NOIP提高组】谁拿了最多奖学金 | OpenJudge NOI 1.9 04:谁拿了最多奖学金 | 洛谷 P1051 [NOIP2005 提高组] 谁拿了最多奖学金
  11. Java读取Level-1行情dbf文件极致优化(2)
  12. 中国移动也要办电竞大赛了!联合腾讯网易办首届电竞大赛
  13. ubuntu 安装搜狗输入法(解决部分ubuntu安装完没有键盘选择栏)
  14. Unity调用Android类方法
  15. LAMP架构源码部署(入门级别超详细步骤)
  16. 卡诺模型:用数据捕捉用户的真正需求
  17. android打包后无法访问http请求
  18. 从0开始建设SAAS系统的建议
  19. 基于单片机智能婴儿车控制设计(毕业设计)
  20. Windows Terminal 使用及美化

热门文章

  1. 【java基础练习】打印空心菱形
  2. 校园网登陆页面跳转不出来解决方法
  3. SUN公司Java认证和考试纵览
  4. word中图片为嵌入式格式时显示不全_word嵌入图片显示不全,教您word插入图片显示不全怎么办...
  5. java classpath 遍历_Java 读取JAR文件信息
  6. numpy.random.rand(d0,d1....,dn)和numpy.random.randint()
  7. linux 命令 xxd linux下查看二进制文件
  8. 数据库启动时遇到ORA-03113: 通信通道的文件结尾
  9. elementUI级联选择器(Cascader)回显问题和clearCheckedNodes无效的解决方法
  10. 自定义注解实现RBAC权限校验,不要再说你不会了