ViewPage + Fragment原理分析

原创 2016年05月30日 13:35:08
  • **在一个 Android 应用中,我使用 FragmentPagerAdapter 来处理多 Fragment 页面的横向滑动。不过我碰到了一个问题,即当 Fragment 对应的数据集发生改变时,我希望能够通过调用
    mAdapter.notifyDataSetChanged()来触发 Fragment 页面使用新的数据调整或重新生成其内容,可是当我调用 notifyDataSetChanged() 后,发现什么都没发生。搜索之后发现不止我一个
    人碰到这个问题,大家给出的解决办法五花八门,有些确实解决了问题,但是我总感觉问题没搞清楚。于是我决定搞明白这个问题到底是怎么回事,以及正确的用法到底如何。要搞明白这
    个问题,仅仅阅读文档并不足够,还需要阅读相关几个类的相关方法的实现,搞懂其设计意图。下面就是通过阅读源代码搞明白的内容。*

1、【ViewPager】

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

>.setAdapter()

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

>.dataSetChanged()

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

2、【PagerAdapter】

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

>.getItemPosition()

该函数用以返回给定对象的位置,给定对象是由 instantiateItem() 的返回值。 在 ViewPager.dataSetChanged() 中将对该函数的返回值进行判断,以决定是否最终触发PagerAdapter.instantiateItem() 函数。 在 PagerAdapter 中的实现是直接传回POSITION_UNCHANGED。如果该函数不被重载,则会一直返回 POSITION_UNCHANGED,从而导致 ViewPager.dataSetChanged() 被调用时,认为不必触发 PagerAdapter.instantiateItem()。很多人因为没有重载该函数,而导致调用PagerAdapter.notifyDataSetChanged() 后,什么都没有发生。

>.instantiateItem()

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

>.notifyDataSetChanged()

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android-底部菜单实现(Fragment+ViewPage)

1.回顾   上篇已经了解过基本的思路 ,和推荐的使用Fragment+ViewPage实现 Android底部菜单tab 2.实现   (1)业务实现   (2)Adpater实现   (...
  • LABLENET
  • LABLENET
  • 2015年09月18日 10:02
  • 1960

多层嵌套viewpage+fragment切换和显示

viewpager用ChildFragmentManager防止切换时fragemtn显示不出来, framgent切换的时候需先调用getParentFragment()然后再调用getFragm...
  • u010775074
  • u010775074
  • 2015年12月18日 10:42
  • 637

Android记录6--ViewPage+Fragment的使用例子

Android记录6--ViewPage+Fragment的使用例子 2013年9月6日 Fragment学习 Fragment这个东西,我到现在才接触到,之前没有用到过,关于Fragment这个...
  • wwj_748
  • wwj_748
  • 2013年09月06日 15:42
  • 36608

viewpage+fragment的生命周期问题

最近想通过viewpager+fragment来实现类似于手机淘宝里面我的订单功能: 在这里面,我每次点击相关viewpager的导航时,实现如下功能: 1:显示一个progressDialog。 ...
  • adfghjkl
  • adfghjkl
  • 2015年08月06日 10:52
  • 1609

ViewPager(一)——最简单的 ViewPage+Fragment实例

用实例说话! AndroidManifest.xml
  • lvyoujt
  • lvyoujt
  • 2016年04月12日 08:22
  • 5600

Android中ViewPage+Fragment的预加载的取消

在最近的项目中,用到ViewPager+Fragment,但是Fragment有个不好或者太好的地方。例如你在ViewPager中添加了三个Fragment,当加载ViewPager中第一个Fragm...
  • qq_21036939
  • qq_21036939
  • 2016年01月27日 11:18
  • 1804

笔记:fragment重复加载和fragment在viewpage中预加载的问题

场景:   viewpage中嵌套fragment来回切换时,fragment每次都会执行oncreate()方法重新加载;   因为viewpage有预加载的机制,在fragment还未显示时,...
  • u011807932
  • u011807932
  • 2016年05月06日 13:14
  • 1790

Android-底部菜单Tabs 三种实现方式(ViewPager,Fragment,ViewPage+Fragment)

1.回顾     在写文章来记录自己的学习的时候,没有录制 gif 效果图,感觉整个人都不好了,还好 通过摸索可以在ubuntu 下 制作gif 动态图 ,从而可以分享给大家了; 2.重点...
  • LABLENET
  • LABLENET
  • 2015年09月18日 09:15
  • 2581

开源中国源码学习UI篇(三)之ViewPager+Fragment的使用分析

今天,来进行ViewPager多页面滑动的学习,之前的学习笔记如下。     ViewPager是Android v4包里面的类,可以让用户切换当前的Fragment。 一、定义基础类Ba...
  • SN2OVFAN
  • SN2OVFAN
  • 2015年10月12日 23:10
  • 1381

【Fragment使用】(二)Android之取消ViewPage+Fragment的预加载

转载自:http://www.cnblogs.com/lee0oo0/p/3713391.html Android之取消ViewPage+Fragment的预加载 用过ViewPage...
  • cangchen
  • cangchen
  • 2015年03月12日 09:51
  • 988
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ViewPage + Fragment原理分析
举报原因:
原因补充:

(最多只允许输入30个字)