Android ViewPager

VeiwPager 是一個ViewGroup,能夠包含不少的View,當手指在屏幕上左右滑動的時候,能夠切換界面。能夠作不少事情,從最簡單的導航,到頁面菜單等。用法與ListView相似,也須要一個適配器,就是PagerAdapter。android

ViewPager通常與Fragment結合使用比較方便。數組

ViewPager+Fragment能夠作出多頁面滑動的效果,讓咱們的應用程序界面操做起來更加靈活ide

ViewPager滑動事件講解:函數

首先ViewPager在處理滑動事件時要用到OnPageChangeListener佈局

OnPageChangeListener這個接口須要實現三個方法:(onPageScrollStateChanged,onPageScrolled ,onPageSelected)字體

onPageScrollStateChanged(int arg0)   ,此方法是在狀態改變的時候調用,其中arg0這個參數有三種狀態(0,1,2)。arg0 ==1的時表示正在滑動,arg0==2的時表示滑動完畢了,arg0==0的時表示什麼都沒作。this

onPageScrolled(int arg0,float arg1,int arg2)    ,當頁面在滑動的時候會調用此方法,在滑動被中止以前,此方法回一直獲得調用。其中三個參數的含義分別爲:spa

arg0 :當前頁面,及你點擊滑動的頁面code

arg1:當前頁面偏移的百分比server

arg2:當前頁面偏移的像素位置   

onPageSelected(int arg0) :此方法是頁面跳轉完後獲得調用,arg0是你當前選中的頁面的Position(位置編號)。

 1、使用ViewPager

  ViewPager的使用與ListView使用相似,也要綁定相應的適配器。

  ViewPager的使用主要分3個步驟:

  一、在佈局文件中添加ViewPager控件。注意:寫這個控件的時候要寫全稱(包名+類名)

<android.support.v4.view.ViewPager
android:id="@+id/main_viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/rg">

<android.support.v4.view.PagerTabStrip
android:id="@+id/pagertab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top" />
</android.support.v4.view.ViewPager>

 PagerTabTrip要當作ViewPager的一個子標籤來用,能夠用android:layout_gravity=TOP|BOTTOM來制定title的位置,若是要顯示出PagerTabTrip的某一項Title,須要在ViewPager的Adapter中實現getPageTitle(int)。

instantiateItem(ViewGroup,int)//實例化頁卡

destroyItem(ViewGroup,int,Object)//刪除頁卡

getCount()//返回頁卡的數量

isViewFromObject(View,Object)//判斷兩個對象是否相等

getPageTitle(int position)//設置標籤顯示的標題

設置指示標籤的屬性:

pagerTabStrip.setTabIndicatorColor();//指示器的顏色

pagerTabStrip.setBackgroundColor();//背景色

pagerTabStrip.setTextColor(Color.WHITE);//設置字體顏色

二、加載要顯示的界面,並把要顯示的頁面放入數組或List集合中

LayoutInflater lf = getLayoutInflater().from(this);  

      view1 = lf.inflate(R.layout.layout1, null);  

      view2 = lf.inflate(R.layout.layout2, null);  

      view3 = lf.inflate(R.layout.layout3, null);  

      

      viewList = new ArrayList<View>();

      viewList.add(view1);  

      viewList.add(view2);  

      viewList.add(view3);  

  三、在Activity裏實例化ViewPager組件,並設置它的Adapter,通常須要重寫PagerAdapter。(和ListView使用差很少,使用步驟也相似。)

 

ViewPager的方法:

  1. setAdapter():ViewPager經過setAdapter()來創建與PagerAdapter的聯繫。這個聯繫是雙向的,一方面,,ViewPager會擁有PagerAdapter對象,從而可調用PagerAdapter的方法,另外一方面,ViewPager會在setAdapter()中調用PagerAdapter的registerDataSetObserver()方法,註冊一個本身生成的PagerObserver 對象,從而在 PagerAdapter 有所須要時(如 notifyDataSetChanged() notifyDataSetInvalidated() 時),能夠調用 Observer onChanged() onInvalidated() 方法,從而實現 PagerAdapter ViewPager 方向發送信息。
  2. dataSetChanged():在 PagerObserver.onChanged(),以及 PagerObserver.onInvalide() 中被調用。所以當 PagerAdapter.notifyDataSetChanged() 被觸發時,ViewPager.dataSetChanged() 也能夠被觸發。該函數將使用 getItemPosition() 的返回值來進行判斷,若是爲 POSITION_UNCHANGED,則什麼都不作;若是爲 POSITION_NONE,則調用 PagerAdapter.destroyItem() 來去掉該對象,並設置爲須要刷新 (needPopulate = true) 以便觸發 PagerAdapter.instantiateItem() 來生成新的對象。

 

2、PagerAdapter

    PagerAdapter是ViewPager的支持者,ViewPager將調用它來取得所需展現的頁面,而PagerAdapter也會在數據變化時通知ViewPager。這個類也是FragmentPagerAdapter以及FragmentStatePagerAdapter的基類。若是繼承此類,至少須要實現instantiateItem(),destroyItem(),getCount()以及isViewFromObject()四個方法。

  • instantiateItem():在每次ViewPager須要一個用以顯示Object的時候,該方法都會被ViewPager.addNewItem()方法調用。該方法內部必定要把指定位置要顯示的視圖添加到ViewPager中。
  • destroyItem():從當前的ViewPager容器中刪除指定位置的View對象。
  • getCount():返回要滑動的View的個數。
  • isViewFromObject():該方法用來判斷instantiateItem(ViewGroup , int)函數所返回來的key與一個頁面視圖是不是表明的同一個視圖(即他倆是不是對應的,對應的表示同一個view) 返回值:若是對應的是同一個View,返回ture,不然返回false

3、ViewPager添加標題

  1. 給ViewPager添加一個子標籤
<android.support.v4.view.PagerTitleStrip
android:id="@+id/pagerTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"/>

2.覆寫PagerAdapter的getPageTitle(position)方法,該方法返回每一個界面的title

  1. @Override
  2. public CharSequence getPageTitle(int position){}

注意:還有一種標題是android.support.v4.view.PagerTabStrip用法與上面的徹底同樣,惟一區別就是每一個標題下面添加了一個下劃線,而且標題也可點擊

 

4、給ViewPager添加監聽器OnPageChageListner

pager.setOnPageChangeListener(new OnPageChangeListener() {
            /**
             * 當滑動結束後,新的pager徹底顯示到屏幕後會調用該方法
             *  參數:新的pager的index
             */
            @Override
            public void onPageSelected(int arg0) {
                // Log.e(TAG, "onPageSelected..." + arg0);
            }

            /**
             * 當正在滑動時,會一直回調該方法 
             * arg0 :當前頁面,及你點擊滑動的頁面
             * arg1:當前頁面偏移的百分比
             * arg2:當前頁面偏移的像素位置
             */
            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
//                Log.e(TAG, "onPageScrolled..." + arg0 + "  " + arg1 + "   " + arg2);
            }
            /**
             * 當狀態方法改變的時候調用
             * 參數:頁面的狀態
             * 共有三種狀態:    
             * SCROLL_STATE_IDLE   頁面靜止的時候的狀態
               SCROLL_STATE_DRAGGING  正在滑動的狀態
               SCROLL_STATE_SETTLING  到了要滑動的最終位置的狀態
             */
            @Override
            public void onPageScrollStateChanged(int arg0) {
//                
                String msg = "";
                switch (arg0) {
                case ViewPager.SCROLL_STATE_DRAGGING:
                    msg = "正在滑動";
                    break;
                case ViewPager.SCROLL_STATE_IDLE:
                    msg = "靜止了";
                    break;
                case ViewPager.SCROLL_STATE_SETTLING:
                    msg = "到了";
                    break;

                default:
                    break;
                }
                Log.e(TAG, "onPageScrollStateChanged..." + msg);
            }
        });
相關文章
相關標籤/搜索