ViewPager用法詳細解析
阿新 • • 發佈:2019-02-18
ViewPager詳解
- ViewPager中的主要方法詳解
- OnPageChangeListener中的三個方法詳解
- 三種介面卡的使用及其主要方法詳解
ViewPager用於實現頁面間的切換。
ViewPager中的主要方法詳解
setAdapter(PagerAdapter adapter)
該方法為ViewPager設定介面卡,ViewPager有三種介面卡,它們分別有不同的特性,下面我會對這三種介面卡進行講解。setCurrentItem(int item)
該方法設定顯示item位置的介面。setOffscreenPageLimit(int limit)
該方法用來設定當前顯示頁面左右兩邊各addOnPageChangeListener(OnPageChangeListener listener)
該方法為ViewPager新增頁面切換時的監聽,關於介面監聽的內容,接下來對OnPageChangeListener中的方法進行講解時,再詳細說明。setOnScrollChangeListener(OnScrollChangeListener l)
該方法為ViewPager增加滾動狀態監聽,但該方法需要minSdkVersion為23
OnPageChangeListener中的三個方法詳解
onPageScrollStateChanged(int state)
該方法在手指操作螢幕的時候發生變化。有三個值:0(END),1(PRESS) ,2(UP) 。當用手指滑動翻頁時,手指按下去的時候會觸發這個方法,state值為1,手指擡起時,如果發生了滑動(即使很小),這個值會變為2,然後最後變為0 。總共執行這個方法三次。一種特殊情況是手指按下去以後一點滑動也沒有發生,這個時候只會呼叫這個方法兩次,state值分別是1,0 。當setCurrentItem翻頁時,會執行這個方法兩次,state值分別為2 ,0 。onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
該方法在滑動過程中將一直被呼叫,該方法的引數說明如下:
position:當用手指滑動時,如果手指按在頁面上不動,position和當前頁面index是一致的;如果手指向左拖動(相應頁面向右翻動),這時候position大部分時間和當前頁面是一致的,只有翻頁成功的情況下最後一次呼叫才會變為目標頁面;如果手指向右拖動(相應頁面向左翻動),這時候position大部分時間和目標頁面是一致的,只有翻頁不成功的情況下最後一次呼叫才會變為原頁面。當直接設定setCurrentItem翻頁時,如果是相鄰的情況(比如現在是第二個頁面,跳到第一或者第三個頁面),如果頁面向右翻動,大部分時間是和當前頁面是一致的,只有最後才變成目標頁面;如果向左翻動,position和目標頁面是一致的。這和用手指拖動頁面翻動是基本一致的。如果不是相鄰的情況,比如我從第一個頁面跳到第三個頁面,position先是0,然後逐步變成1,然後逐步變成2;我從第三個頁面跳到第一個頁面,position先是1,然後逐步變成0,並沒有出現為2的情況。
positionOffset:當前頁面滑動比例,如果頁面向右翻動,這個值不斷變大,最後在趨近1的情況後突變為0。如果頁面向左翻動,這個值不斷變小,最後變為0。
positionOffsetPixels:當前頁面滑動畫素,變化情況和positionOffset一致onPageSelected(int position)
position是被選中頁面的索引,該方法在頁面被選中或頁面滑動足夠距離切換到該頁手指擡起時呼叫。
三個方法的執行順序:用手指拖動翻頁時,最先執行一遍onPageScrollStateChanged(1)
,然後不斷執行onPageScrolled
,放手指的時候,直接立即執行一次onPageScrollStateChanged(2)
,然後立即執行一次onPageSelected
,然後再不斷執行onPageScrollStateChanged
,最後執行一次onPageScrollStateChanged(0)
。
三種介面卡的使用及其主要方法詳解
三種介面卡繼承關係
PagerAdapter
主要方法詳解
public abstract int getCount ()
返回有效檢視的數量。public int getItemPosition (Object object)
當宿主檢視嘗試判斷一項的位置是否改變時呼叫。如果給定項的位置沒有改變則返回POSITION_UNCHANGED
,如果該項不再存在於介面卡中則返回POSITION_NONE
。
在ViewPager.dataSetChanged()中將對該函式的返回值進行判斷,如果返回POSITION_NONE
則呼叫destroyItem(ViewGroup container, int position, Object object)
方法將該檢視銷燬,如果返回POSITION_UNCHANGED
則不做任何改變,如果資料改變,則觸發PagerAdapter.instantiateItem(ViewGroup container, int position)
方法改變檢視。
PagerAdapter中該方法的預設返回值是 POSITION_UNCHANGED。如果沒有過載該函式,而導致呼叫PagerAdapter.notifyDataSetChanged() 後,什麼都沒有發生。public boolean isViewFromObject (View view, Object object)
決定一個頁面view是否與instantiateItem(ViewGroup, int)
方法返回的具體key物件相關聯。
viewpager不直接處理每一個檢視而是將各個檢視與一個鍵聯絡起來。這個鍵用來跟蹤且唯一代表一個頁面,不僅如此,該鍵還獨立於這個頁面所在adapter的位置。當pageradapter將要改變的時候他會呼叫startUpdate
函式,接下來會呼叫一次或多次的instantiateItem
或者destroyItem
。最後在更新的後期會呼叫finishUpdate
。當finishUpdate
返回時instantiateItem
返回的物件應該新增到父ViewGroup,destroyItem
返回的物件應該被ViewGroup刪除。isViewFromObject(View, Object)
代表了當前的頁面是否與給定的鍵相關聯。
自定義Key示例-簡單的將位置position最為key
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
public Object instantiateItem (ViewGroup container, int position)
建立指定位置的頁面檢視。介面卡有責任增加即將建立的View檢視到給定的container中,確保在finishUpdate(viewGroup)返回時,增加檢視的事情已經完成。
該方法的返回值是新增檢視頁面的Object(Key),這裡沒必要非要返回檢視本身,也可以是這個頁面的其它容器,它可以返回和檢視相關聯的任何值。public void destroyItem (ViewGroup container, int position, Object object)
移除給定位置的view,介面卡有責任將該view從container中移除,確保在finishUpdate(viewGroup)返回時,移除檢視的事情已經完成。public void startUpdate (ViewGroup container)
在展示的介面中有改變將要發生時呼叫。public void finishUpdate (ViewGroup container)
展示介面中的改變完成時呼叫。在這個時間點上,你必須確保所有的頁面已被合適的從container中新增或移除。public void notifyDataSetChanged ()
該方法由應用程式在介面卡資料改變時主動呼叫。public void registerDataSetObserver (DataSetObserver observer)
註冊一個觀察者去接收關聯到介面卡資料變化的回撥。public void unregisterDataSetObserver (DataSetObserver observer)
反註冊去接收關聯到介面卡資料變化的回撥的觀察者。public void setPrimaryItem (ViewGroup container, int position, Object object)
呼叫該方法去通知當前介面卡的哪一項被考慮為“primary”,它是當前展示給使用者的頁面。public CharSequence getPageTitle (int position)
該方法由ViewPager在獲取描述頁面的標題時呼叫。該方法預設返回null。public float getPageWidth (int position)
該方法返回給定頁面的比例寬度,範圍(0.f-1.f]。public Parcelable saveState ()
儲存與介面卡關聯的例項狀態,噹噹前UI狀態需要重建時恢復。public void restoreState (Parcelable state, ClassLoader loader)
恢復之前由saveState ()
儲存的與介面卡關聯的例項狀態。
PagerAdapter使用示例
activity_pager_adapter.xml檔案
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
page1.xml檔案
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
page2.xml檔案
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
page3.xml檔案
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
page4.xml檔案