温故知新-ViewPager学习笔记

来源:互联网 发布:dell windows 10 光盘 编辑:程序博客网 时间:2024/04/30 03:22

1.ViewPager

ViewPager

布局管理器允许用户通过左右滑动浏览每一页的数据。你应该提供一个PagerAdapter的实现来生成页面显示的View。

ViewPager通常与Fragment组合使用,这样可更便于提供和管理每一页的生命周期。FragmentPagerAdapter和FragmentStatePagerAdapter是官方提供的两个标准模板,它包含一些通用的情况以及所有用户接口的简单实现。

常量

SCROLL_STATE_DRAGGING 标识用户正在拖动这个页面
SCROLL_STATE_IDLE 标识页面处于空闲状态,即用户未操作ViewPager
SCROLL_STATE_SETTLING 标识页面正在切换过程中

方法

boolean beginFakeDrag ()

开启页面滑动阻止模式。这在ViewPager页面中存在可滑动的子View(如页面中包含ListView)时非常有用,此时它仍然可以控制事件的捕捉和滑动行为。调用fakeDragBy(float)指定阻止拖动,调用endFakeDrag()结束拖动阻止模式,并在需要的时候滑动。
当处于滑动阻止模式时,ViewPager将会忽略所有的触摸操作。但是如果已经在开始一个拖动操作了,则不能启动滑动阻止模式,即它将返回false。

void fakeDragBy (float xOffset)

使用xOffset(单位像素)距离来阻止拖动。在此之前必须首先调用beginFakeDrag。

void endFakeDrag ()

结束滑动阻止模式。

boolean isFakeDragging()

当处于滑动阻止模式时返回true,否则false。

boolean canScrollHorizontally (int direction)

检查当前页面是否可向指定方向滑动。direction为正时代表向右,为负时代表向左。

int getOffscreenPageLimit ()

获得缓存的页面个数,默认值是1.

void setOffscreenPageLimit (int limit)

设置Viewpager视图结构中除当前显示页面之外需要缓存的空闲页面数量。这些页面将在需要的时候被重建。
这个用来让程序员选择优化,以使得页面切换过渡平滑。如果仅仅包含3-4个页面,可以选择将他们全部缓存,这样在他们之间导航时不会消耗太多的时间。

ViewPager.OnPageChangeListener

void onPageScrollStateChanged (int state)void onPageScrolled (int position, float positionOffset, int positionOffsetPixels)void onPageSelected (int position)

2.PagerAdapter

PagerAdapter

用于向ViewPager中填充页面的基类。针对具体的ViewPager我们可能需要扩展这个基类,官方提供了两个标准示范:FragmentPagerAdapter和FragmentStatePagerAdapter。

当需要扩展这个类时,我们至少需要重写以下四个方法:

Object instantiateItem (ViewGroup container, int position)void destroyItem (ViewGroup container, int position, Object object)int getCount ()boolean isViewFromObject (View view, Object object)

PagerAdapter比AdapterViews更具普遍性。在视图更新时,ViewPager采用回调方法来标识执行的每一步,而不依赖于View的回收机制。PagerAdapter可能实现一系列View回收方法或则采用一个更加复杂的方法来管理每个页面,比如使用Fragmenttransactions来管理每个Fragment页面。

ViewPager通过key对象关联到各个页面,而不是直接去管理这些页面。这个key对象用来跟踪和标识各个页面,而不与页面在adapter中的具体位置相关。调用startUpdate(ViewGroup)时表示ViewPager的内容将要发生改变,这样instantiateItem(ViewGroup, int)与destroyItem(ViewGroup, int, Object)两个方法就会被一次或多次调用,内容更新完成后,finishUpdate(ViewGroup)会被调用。instantiateItem(ViewGroup,int)将返回代表添加的页面的key对象,这个对象与对应的页面关联,它可以就是这个页面对象本身,但大多时候都设计为其他专门用于绑定的key对象。destroyItem(ViewGroup, int, Object)则会移除删除页面对应的Key对象。isViewFromObject(View view, Object key)方法用于标识view是否与key关联。使用view对象本身作为它的key值确实是一个简便方法,此时isViewFromObject方法体内就是:return view == object。

PagerAdapter支持页面更新,页面更新必须在主线程中调用notifyDataSetChanged()方法完成,这和BaseAdapter中的更新方法是类似的。页面的更新可能是添加、删除、或则简单的更改页面位置。

常量

POSITION_NONE 表示这个item已经不再pagerAdapter中
POSITION_UNCHANGED 表示这个item在pagerAdapter中的位置未改变

方法

int getItemPosition (Object object)

获得key为object的页面所在的位置。它可以用来判断页面位置是否已经改变,如果页面位置未改变,将返回POSITION_UNCHANGED(-1),如果页面已经不存在,则返回POSITION_NONE(-2);如果页面位置已经改变,则返回页面新的位置。
默认的实现返回POSITION_UNCHANGED(-1)。

CharSequence getPageTitle (int position)

获得指定位置页面的title。默认的实现返回null。

3.FragmentPagerAdapter

FragmentPagerAdapter

它是PagerAdapter的一种实现,每一个页面都是一个Fragment,并且每一个页面都会保存到fragment manager中,当用户没有可能回到该页面时fragment manager才会将这个fragment销毁。

这种页面十分适用于有一些静态的fragment,例如一组tabs,用户访问的每一个页面都会保存在内存中,尽管当view不可见时可能会被销毁。这就会导致应用程序会占用太多的资源,所以,通常当页面数据量过大时使用FragmentStatePagerAdapter来代替FragmentPagerAdapter。

当使用FragmentPageAdapter时ViewPager必须有一个ID。

子类只需要实现适配器的getItem(int)和getCount()方法。

destroyItem()和isViewFromObject()方法的默认实现:

public void destroyItem(ViewGroup container, int position, Object object) {    if (mCurTransaction == null) {        mCurTransaction = mFragmentManager.beginTransaction();    }    mCurTransaction.detach((Fragment)object);}public boolean isViewFromObject(View view, Object object) {    return ((Fragment)object).getView() == view;}

4.FragmentStatePagerAdapter

FragmentStatePagerAdapter

它是PagerAdapter的一种实现,使用一个fragment来管理各个页面。这个类可以处理保存和恢复frament的状态。

这个pageAdapter类适合在拥有大量页面时使用,它就像listView一样。当页面不再可见时,它所在的整个fragment都会被销毁,而仅仅保存fragment的状态。

当使用FragmentStatePagerAdapter时ViewPager必须有一个ID。

子类只需要实现适配器的getItem(int)和getCount()方法。

destroyItem()和isViewFromObject()方法的默认实现:

public void destroyItem(ViewGroup container, int position, Object object) {    Fragment fragment = (Fragment)object;    if (mCurTransaction == null) {        mCurTransaction = mFragmentManager.beginTransaction();    }    while (mSavedState.size() <= position) {        mSavedState.add(null);    }    mSavedState.set(position, mFragmentManager.saveFragmentInstanceState(fragment));    mFragments.set(position, null);    mCurTransaction.remove(fragment);}public boolean isViewFromObject(View view, Object object) {    return ((Fragment)object).getView() == view;}
0 0
原创粉丝点击