温故知新-ViewPager学习笔记
2016-08-09 23:25
393 查看
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; }
相关文章推荐
- Android UI学习笔记 之 使用ViewPager实现导航
- 2.3学习笔记 viewpager、简单的位运算
- ViewPager+Fragment 懒加载学习笔记(一)
- Android之ViewPager学习笔记(MVP模式)
- android ViewPager学习笔记1
- 安卓智慧上海学习笔记系列——禁用ViewPager滑动事件
- 安卓学习笔记之ViewPager
- 安卓学习笔记之制作ViewPager欢迎界面
- Andorid学习笔记 12 ViewPager
- 安卓学习笔记之ViewPager
- Android的 ViewPager 学习笔记
- ViewPager学习笔记
- 2016.07.31学习笔记---ViewPager滑动监听的参数解释
- Android的 ViewPager 学习笔记
- Android之Fragment+ViewPager实现点击+滑动界面切换学习笔记
- ViewPager学习笔记
- 安卓学习笔记---ViewPager+Fragment第二次进入显示空白
- 学习笔记之ViewPager
- Android开发学习笔记六 ViewPagerIndicator
- 学习笔记-touch事件分发:viewpager中的listview