Android ViewPager的工作原理

ViewPager的工作原理(Android)


ViewPager和PagerAdapter在後臺爲我們完成了很多工作,接下來讓我們來深入學習ViewPager的工作原理。

大多數情況下,我們無需瞭解其內部實現細節。不過如果要自己實現PagerAdapter接口,則需要了解ViewPager-PagerAdapterRecyclerView-Adapter各自關係的異同。

1.什麼情況需要自己實現原生PagerAdapter接口?

    當需要ViewPager託管非fragment視圖時(如圖片這樣的常見View對象),就需要實現原生PagerAdapter接口。

2.爲什麼使用ViewPager而不是RecyclerView?

    由於無法使用現有的Fragment,因此使用RecyclerView需處理大量內部實現工作,Adapter需要我們及時地提供View。然而,決定fragment視圖何時創建的是FragmentManager。因此,當RecyclerView要求Adapter提供fragment視圖時,我們無法立即創建fragment並提供其視圖。

    這就是ViewPager存在的理由。ViewPager使用的是PagerAdapter類,而非原來的Adapter。PagerAdapter要比Adapter複雜的多,因爲它要處理更多的視圖管理工作。

3.PagerAdapter內部實現:

    PagerAdapter不使用可返回視圖的onBindViewHolder(…)方法(Adapter使用該方法),而是使用下列方法:

    public Object instantiateItem(ViewGroup container, int position)——告訴pager adapter創建指定位置的列表項視圖,然後將其添加給ViewGroup視圖容器

注:該方法並不要求立即創建視圖,因此PagerAdapter可自行決定何時創建視圖。

    public void destroyItem(ViewGroup container, int position, Object object)——告訴pager adapter銷燬已鍵視圖

    public abstract boolean isViewFromObject(View view, Object object)——調用instantiateItem()創建完視圖後,ViewPager會在某個時間點看到它。爲確定視圖所屬的對象,ViewPager會調用isViewFromObject()方法

注:這裏的Object參數,是instantiateItem()方法返回的對象。

    假設ViewPager調用instantiateItem(ViewGroup,5)方法返回A對象,那麼只要傳入的View參數是第5個對象的視圖,isViewFromObject(View,A)方法就應返回true值,否則返回false值。

    對於ViewPager來說,這是一個複雜的過程,但對於PagerAdapter來說很簡單。因爲PagerAdapter只要能夠創建、銷燬視圖以及識別視圖來自哪個對象即可。這樣的要求顯然很寬鬆,因而PagerAdapter能夠自由地通過instantiateItem()方法創建並添加新的fragment,然後返回可以跟蹤管理的Object(fragment)。

    以下爲isViewFromObject()方法的具體實現:

@Override
public boolean isViewFromObject(View view, Object object){
    return ((Fragment)object).getView()==view;
}

    可以看到,每次需要使用ViewPager時,都要覆蓋實現PagerAdapter的這些方法,這真是一種磨難。

    幸好,還有FragmentPagerAdapterFragmentStatePagerAdapter可以返回的fragment添加給託管activity,並幫助ViewPager找到fragment的視圖並一一對應。真心感謝它們!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章