前言

在实际的Android开发当中,ViewPager是我们经常使用的组件之一。比如我们常见的应用的引导页、Banner自定义控件中都有使用到ViewPager。

ViewPager

ViewPager简介和作用

ViewPager是Android扩展包v4包,这个类可以让用户切换当前的view。

1.ViewPager类直接继承了ViewGroup类,所以它是一个容器类,可以在其中添加其他View类。
2.ViewPager类需要一个PagerAdapter适配器类给它提供数据。
3.ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用。

ViewPager的使用

ViewPager的功能就是可以使视图滑动,就像Lancher左右滑动那样。分三个步骤来使用它:

  1. 在XML文件中加入;
  2. 加载要显示的页卡
  3. 在Activity里实例化ViewPager组件,并且设置Adapter(PagerAdapter,方法与ListView一样的),在这里一般需要重写PagerAdapter。)

XML文件中配置

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

监听事件

viewpager.setOnPageChangeListener(new OnPageChangeListener() {

    @Override
    public void onPageSelected(int arg0) {
        //当页面选中时
    }
    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2){ 
        //arg0 当前页
        //arg1 移动页百分比
        //arg2 移动像素点
    }
    @Override
    public void onPageScrollStateChanged(int arg0) {
        //滑动状态改变
    }
};

ViewPager的适配器

简介中提到了PagerAdapter,和ListView等控件使用一样,需要ViewPager设置PagerAdapter来完成页面和数据的绑定,这个PagerAdapter是一个基类适配器,我们经常用它来实现App引导页,它的子类有FragmentPagerAdapter和FragmentStatePagerAdapter,这两个子类适配器用于和Fragment一起使用,在App中它们就像Listview一样出现的频繁。

实现一个最基本的PagerAdapter,必须实现下面的四个方法,在代码中有注释出来

import java.util.List; 

import android.support.v4.view.PagerAdapter;
import android.view.View; 
import android.view.ViewGroup;

public class MyAdapter extends PagerAdapter{
    private List<View> list;

    public MyAdapter(List<View> list){
        this.list = list;
    }
    @Override
    public int getCount() {
        //必须实现,返回要展示的图片数量
        return list.size();
    }
    @Override
    public boolean isViewFromObject(View view, Object object) {
        //必须实现
        return view == object;
    }
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        //必须实现,实例化
        container.addView(list.get(position));
        return list.get(position);
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        //必须实现,销毁
        container.removeView(list.get(position));
    }
}

ViewPager结合Fragment显示

从前面几篇文章,我们知道,实现ViewPager是要有适配器的,我们前面用的适配器是PagerAdapter,而对于Fragment,它所使用的适配器是:FragmentPagerAdapter。FragmentPagerAdapter派生自PagerAdapter,它是用来呈现Fragment页面的,这些Fragment页面会一直保存在fragment manager中,以便用户可以随时取用。

在使用ViewPager时,必须使用v4包下的Fragment,并且使用FragmentActivity。

这个适配器最好用于有限个静态fragment页面的管理。尽管不可见的视图有时会被销毁,但用户所有访问过的fragment都会被保存在内存中。因此fragment实例会保存大量的各种状态,这就造成了很大的内存开销。所以如果要处理大量的页面切换,建议使用FragmentStatePagerAdapter.

对于FragmentPagerAdapter的派生类,只需要重写getItem(int)和getCount()就可以了。

public class FragAdapter extends FragmentPagerAdapter {
     private List<Fragment> mFragments;

     public FragAdapter(FragmentManager fm,List<Fragment> fragments) {
            super(fm);
            mFragments=fragments;
    }

    @Override
    public Fragment getItem(int arg0) {
          //根据传来的参数arg0,来返回当前要显示的Fragment
          return mFragments.get(arg0);
    }

    @Override
    public int getCount() {
          //返回用于滑动的fragment总数
          return mFragments.size();
      }
 }