国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中viewPager使用指南

2020-04-11 10:57:21
字體:
來源:轉載
供稿:網友

viewPager是谷歌官方提供的一種方便實現頁面滑動效果的控件,可以直接使用也可以和fragment聯合使用。這里只簡單說下直接使用。
 使用viewPager的步驟如下:

(1)在布局中放入viewPager的控件
 (2)設置加載到viewPager中的view
 (3)編寫viewPager特有的adapter
 (4)實例化viewPager并給他綁定上步設置的adapter

這個步驟體現的也是MVC思想,可以參考我之前的文章//m.survivalescaperooms.com/article/78174.htm

這里為了方便說明 我新建一個項目來說明viewPager的使用

步驟一 在布局中新建一個viewPager

布局文件如下:

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

設置加載到viewPager中的view

這里為了方便,顯示設置2個不同背景的顏色的view,放入viewPager中,每個view的布局如下圖:
 item_one

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"       android:layout_width="match_parent"       android:layout_height="match_parent"  android:background="@android:color/holo_red_light"></LinearLayout>

item_two

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"       android:layout_width="match_parent"       android:layout_height="match_parent"  android:background="@android:color/holo_blue_bright"></LinearLayout>

編寫viewPager特有的adpter

這里我們繼承viewPager的PagerAdapter,主要重寫getCount方法、destroyItem 、instantiateItem 、isViewFromObject 、。代碼如下:

public class Adapter extends PagerAdapter{    private List<View> views;    public Adapter(List<View> views){      this.views = views;    }    @Override    public int getCount() {      return views.size();    }    @Override    public void destroyItem(View arg0, int arg1, Object arg2) {      ((ViewPager) arg0).removeView(views.get(arg1));    }    @Override    public void finishUpdate(View arg0) {    }    @Override    public Object instantiateItem(View arg0, int arg1) {      ((ViewPager) arg0).addView(views.get(arg1), 0);      return views.get(arg1);    }    @Override    public boolean isViewFromObject(View arg0, Object arg1) {      return arg0 == (arg1);//      return false;    }    @Override    public void restoreState(Parcelable arg0, ClassLoader arg1) {    }    @Override    public Parcelable saveState() {      return null;    }    @Override    public void startUpdate(View arg0) {    }  }

實例化viewPager并綁定Adapter

這里,實例化viewPager 為mpager ,然后將建好的view:item_one 和item_two 通過LayoutInflater加載到建好的View類型的數組中。將數組加到List<View>里面。作為參數傳入到adapter。代碼如下:

private ViewPager mpager;  private List<View> myview = new ArrayList<>();  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    mpager = (ViewPager) findViewById(R.id.view_pager);    LayoutInflater mInflater = getLayoutInflater();    View [] pagers = {mInflater.inflate(R.layout.item_one ,null),              mInflater.inflate(R.layout.item_two , null)};    for(int i = 0; i < pagers.length ; i++) {      myview.add(pagers[i]);    }    Adapter ad = new Adapter(myview);    mpager.setAdapter(ad);    mpager.setCurrentItem(0);  }

PS :實現viewPager手動無限循環

這里用一種設置頁面跳轉的方式來實現無限循環。在myviews數組中加入兩個view,分別在第0個位置加入最后一個itemview,和最后一個位置加入第一個itemview。代碼如下所示:

final View [] pagers = {mInflater.inflate(R.layout.item_one ,null),              mInflater.inflate(R.layout.item_two , null),              mInflater.inflate(R.layout.item_three,null)};    for(int i = 0; i < pagers.length ; i++) {      myview.add(pagers[i]);    }    myview.add(0,mInflater.inflate(R.layout.item_three , null));    myview.add(4, mInflater.inflate(R.layout.item_one, null));

這里為了測試方便,這里在上個基礎上加入了一個item,就是三張view循環播放
 用來實現銜接。當向右滑動到最后一個頁面的時候,將這個頁指定為第一個view所在的頁,向左滑動到第一個頁面的時候,將這個頁面制定為最后一個view所在頁。注意這里的view最后一個不是指數組的最后一個 而是指三個view中最后一個。

設置viewPager的實例化對象的方法setOnPageChangeListener 雖然此方法顯示不推薦使用,但為了實現這個功能,還是先將就用吧。等日后谷歌更新viewPager,能有屬性自動實現循環。
 代碼如下:

 mpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {      @Override      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {      }      @Override      public void onPageSelected(int position) {        int index = position;        if(index == 0){        //注意這里pagers數組,不是myviews數組          index = pagers.length;        }else if(position == pagers.length + 1){          index = 1;        }        if(position != index){          mpager.setCurrentItem(index, false);        }      }      @Override      public void onPageScrollStateChanged(int state) {      }    });

重寫Adapter中的instantiateItem 方法來顯示view

public Object instantiateItem(View arg0, int arg1) {      if(arg1 == 0){        ((ViewPager) arg0).removeView(views.get(myview.size() - 3));        ((ViewPager) arg0).addView(views.get(myview.size() - 3), 0);      }else if(arg1 == myview.size() - 1){        ((ViewPager) arg0).removeView(views.get(0));        ((ViewPager) arg0).addView(views.get(0), 0);      }else{        ((ViewPager) arg0).addView(views.get(arg1), 0);      }      return views.get(arg1);    }

這樣無限滑動就可以簡單實現,但在滑動時會出現有空白頁面的bug,可能是因為先removeView,在加入view的原因。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 闵行区| 绥芬河市| 德兴市| 北京市| 交城县| 达州市| 龙海市| 华蓥市| 宕昌县| 游戏| 柳河县| 修武县| 绿春县| 图木舒克市| 荔波县| 保定市| 华安县| 张家港市| 东宁县| 梓潼县| 额尔古纳市| 金湖县| 屯昌县| 锡林郭勒盟| 镇坪县| 宁河县| 延寿县| 保山市| 香格里拉县| 博客| 紫金县| 临漳县| 唐河县| 龙口市| 游戏| 姜堰市| 饶平县| 贵南县| 潼南县| 女性| 徐水县|