您的位置:首页 > 其它

viewpager与pageradapter具体生命流程是怎样调用的

2015-03-12 15:49 288 查看
最近公司一个项目要用到viewpager,可能很多人都会使用它,也应该有很多人发现要想用好它也不是一件容易的事情,经常会出现一些莫名其妙的事情,更不要说与fragment一起使用时常出现的空白页bug,下面是我对viewpager中几个重要方法的理解,只有理解原理才能分析bug产生的原因,才能去解决问题。


【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() 来生成新的对象。

【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 的操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐