关于PagerAdapter的粗略翻译
英文版api地址:PagerAdapter(自备*)
PagerAdapter
已知直接子类:FragmentPagerAdapter、FragmentStatePagerAdapter 类概述(Class Overview):
基类提供适配器(Adapter)来将一些页面装进ViewPager中。也许很有可能你想使用一些经过特殊继承实现后的子类,比如FragmentPagerAdapter或者FragmenStatePagerAdapter。
当你想实现一个PagerAdapter时,你最少得重载下面的四种方法:
- instantiateItem(ViewGroup,int)
- destroyItem(ViewGroup,int,Onject)
- getCount()
- isViewFromObject(View,Object)
PagerAdapter比AdapterViews更加具有普遍性,在视图更新过程中,PagerAdapter并没有直接采用视图回收重用策略(View recycling mechanism),而是使用的一系列的回调(callback)来指示更新过程中的各个步骤过程。如果要求的话,一个PagerAdapter也许会实现一个关于视图回收的表格,或者会使用一个十分复杂(sophisticated)的方法来管理每一页的视图,比如当每一页是fragment时,会用Fragment 事务处理(transaction).
在ViewPager中,它联系每一个页面是通过一个键对象(key object),而不是直接操作每个页面中的视图的。这些键对象被用来追踪和唯一标记ViewPager中的每一页,使得在适配器每一个(页)的位置变得独立。PagerAdapter中在调用startUpdate(ViewGroup)时,表明ViewPager中的内容将要发生变化了,在startUpdate(ViewGroup)调用之后,一个或者多个instantiateItem(ViewGroup,int)和/或者destroyItem(ViewGroup,int,Onject)将会陆续执行,最终调用的是finishUpdate(ViewGroup),来表更新已经结束了。等到finishUpdate(ViewGroup) 执行完成之前,那些和键对象联系起来的视图,应该在instantiateItem(ViewGroup,int)方法执行完成之前将其添加到父视图(parentviewgroup)中去,并且将那些要移除的有关的视图在destroyItem(ViewGroup,int,Onject)方法执行后完成移除。而isViewFromObject(View,Object)方法是用来标记一个视图是否和一个键对象所匹配。
一个简单PagerAdapter也许会使用这些被键对象化的页面视图,也就是说会在instantiateItem(ViewGroup,int)调用执行完毕之后会完成创建和添加视图到父布局中去,这时也就是被键对象化了。与instantItem(ViewGroup,int)对应的方法detroyItem(ViewGroup,int,Object)会移除父布局中指定的视图。最后,isViewFromOnject(View,Object)应该这样实现:return view == object;
PagerAdapter支持数据集的变化。应该注意的是:数据集变化必须发生(执行)在主线程中,并且notifyDataSetChanged()方法的调用就标志着数据集更新的结束。这点有点像AdapterView中所需的那些继承于BaseAdapter的适配器。数据集的变化包括页面的添加、移除或者改变位置。对应的ViewPager将会通过调用getItemPosition(Object)获得当前显示哪个页面,并且会保持当前页面的活力。
常量(Constants):
- public static final int POSITION_NONE
常量值:-2
- public static final int POSITION_UNCHANGED
常量值:-1
公有构造方法(Public Constructors):
public PagerAdapter ()
公有方法(Public Methods):
public void destroyItem(ViewGroup container,int position,Object object)
移除对应指定位置(position)的页面。适配器负责从container中移除这些视图,尽管它唯一保证在finishUpdate(ViewGroup)之前执行完!
public void finishUpdate(ViewGroup container)
当展示页面变化成功时调用该方法。此时应该确保所有的页面在适当的时候已经完成了添加、移除工作。
public abstract int getCount()
返回可用的视图数
public int getItemPosition(Object object)
当主视图尝试去判断一个子视图的状态位置是否发生变化时会调用此方法。返回POSITION_UNCHANGED表示指定子视图位置状态没有发生变化。POSITION_NONE表示子视图已经不存在于适配器中。
默认的实现是假设子视图没有发生变化,即返回POSITION_UNCHANGED
Returns:
int:对象的新位置索引,取址范围为[0-getCount()]、POSITION_UNCHANGED、POSITION_NONE
public CharSequence getPageTitle(int position)
当ViewPager想去获得一个字符串来分别描述特定的页面时,会调用该方法。当指定页面没有字符串来描述的话就会返回null。默认实现就是返回null
public float getPageWidth(int position)
返回相对于ViewPager的测量宽度的比例宽度,返回形式以百分比形式返回
public Object instantiateItem(ViewGroup container,int position)
创建指定页。适配器负责添加视图到父布局中去。该方法只确保它会在finishUpdate(ViewGroup)调用之前完成
Returns:
Object:返回的这个对象代表了新的一个页面(Page)。它不一定是一个视图View,有可能是一些其他的父布局(Container)。
public abstract boolean isViewFromObject(View view,Object object)
判断一个页面(Page)是否对应产生了一个唯一的键对象,而产生唯一键对象的过程是通过instantiateItem(ViewGroup,int)方法的调用和完成实现的。本方法保证了PagerAdapter能够运行正常。
public void notifyDataSetChanged()
此方法应该在应用中被调用。并且是在数据发生变化、对应的视图需要更新时才可调用。
public void registerDataSetObserver(DataSetObserver observer)
注册一个观察者来接收当数据发生变化时的回调。
public void restoreState(Parcelable state,ClassLoader loader)
恢复和当前适配器相关的任何实例状态,前提是你要在之前就通过saveState()方法保存了实例状态。
public Parcelable saveState()
保存任何和当前适配器有关的数据,以供在之后UI状态发生重建时的实例状态恢复
public void setPrimaryItem(ViewGroup container,int position,Object object)
调用该方法是为了告知适配器哪个子页面目前被视为主要的子页面。它对应的是给用户展示的当前页。
public void startUpdate(ViewGroup container)
当展示页有变化并且将要开始更新时会调用该方法。
public void unregisterDataSetObserver(DataSetObserver observer)
解除一个观察者对于数据变化时的回调方法的监视。