關於PagerAdapter的粗略翻譯 英文版api地址:PagerAdapter(自備梯子) PagerAdapter instantiateItem(ViewGroup,int) destroyItem(ViewGroup,int,Onject) getCount() isViewFromObj ...
關於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)
解除一個觀察者對於數據變化時的回調方法的監視。