1、ViewPager主要用来左右滑动。(类似图片轮播)
2、ViewPager要用适配器来连接“视图”和“数据”。(大家可以联想下listview的使用方法,原理是类似的)
3、官方推荐ViewPager与Fragment一起使用,并且有专门的适配器。
ViewPager继承自ViewGroup,也就是ViewPager是一个容器类,可以包含其他的View类。
ViewPager引入的时候必须写完整android.support.v4.view.ViewPager
写3个这样的page3.xml作为3个页面(view1,view2,view3三个图片分别对应page1,2,3):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@drawable/view3" />

然后是我们的主页面布局,只有一个ViewPager:
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     >

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

</LinearLayout>

好啦,我们已经把该准备的布局文件都准备好了,接下来我们开始来敲代码。
viewpager是通过适配器来进行管理的(数据源—适配器—视图)。我们分别来看看:
数据源:这里的数据比较简单,就是包含3个View的一个list

private View page1, page2, page3; // ViewPager包含的页面
private List<View> pageList; // ViewPager包含的页面列表,一般给adapter传的是一个list

MainActivity.java
......

LayoutInflater inflater = getLayoutInflater();
page1 = inflater.inflate(R.layout.page1, null);
page2 = inflater.inflate(R.layout.page2, null);
page3 = inflater.inflate(R.layout.page3, null);

pageList = new ArrayList<View>();
pageList.add(page1);
pageList.add(page2);
pageList.add(page3);

视图:一般视图都是比较简单的,这里也不例外,就是一个ViewPager

private ViewPager myViewPager; // 要使用的ViewPager

......

myViewPager = (ViewPager) findViewById(R.id.myViewPager);

适配器:在大多数使用适配器的控件里,适配器相对于数据源和视图来说都更加复杂,同时也决定了这个控件主要的功能。ViewPager也不例外,所以我们有必要对PagerAdapter深入了解一下。
我们先来看看API中对PagerAdapter的描述:
PagerAdapter是用于“将多个页面填充到ViewPager”的适配器的一个基类,大多数情况下,你们可能更倾向于使用一个实现了PagerAdapter并且更加具体的适配器,例如FragmentPagerAdapter或者FragmentStatePagerAdapter。

当你实现一个PagerAdapter时,你至少需要重写下面的几个方法:

instantiateItem(ViewGroup, int)
destroyItem(ViewGroup, int, Object)
getCount()
isViewFromObject(View, Object)
PagerAdapter比很多AdapterView的适配器更加通用。ViewPager使用回调机制来显示一个更新步骤,而不是直接使用视图回收机制。如果需要时,PagerAdapter也可以实现视图回收方法,或者直接使用一种更加巧妙的方法来管理页面,比如直接使用能够管理自身事务的Fragment。

ViewPager并不直接管理页面,而是通过一个key将每个页面联系起来。这个key用来跟踪和唯一标识一个给定的页面,且该key独立于adapter之外。PagerAdapter中的startUpdate(ViewGroup)方法一旦被执行,就说明ViewPager的内容即将开始改变。紧接着,instantiateItem(ViewGroup, int)和/或destroyItem(ViewGroup, int, Object)方法将会被执行,然后finishUpdate(ViewGroup)的执行就意味着这一次刷新的完成。当finishUpdate(ViewGroup)方法执行完时,与instantiateItem(ViewGroup, int)方法返回的key相对应的视图将会被加入到父ViewGroup中,而与传递给destroyItem(ViewGroup, int, Object)方法的key相对应的视图将会被移除。isViewFromObject(View, Object)方法则判断一个视图是否与一个给定的key相对应。

一个简单的PagerAdapter会选择将视图本身作为key,在将视图创建并加入父ViewGroup之后通过instantiateItem(ViewGroup, int)返回。这种情况下,destroyItem(ViewGroup, int, Object) 的实现方法只需要将View从ViewGroup中移除即可,而isViewFromObject(View, Object)的实现方法可以直接写成return view == object;。

PagerAdapter支持数据集的改变。数据集的改变必须放在主线程中,并且在结束时调用notifyDataSetChanged()方法,这与通过BaseAdapter适配的AdapterView类似。一个数据集的改变包含了页面的添加、移除或者位移。ViewPager可以通过在适配器中实现getItemPosition(Object)方法来保持当前页面处于运行状态。

呼,看完了这一段描述,小伙伴们是不是有点累了呢~~~不过同时也一定对ViewPager的适配器有了更多的了解了吧?我们来筛选下初学时常用的知识点(如果要深入了解的话,还是要把其他的知识也好好掌握哦):

instantiateItem(ViewGroup, int)负责初始化指定位置的页面,并且需要返回当前页面本身(其实不一定要View本身,只要是能唯一标识该页面的key都可以,不过初学者一般就先用View本身作为key就可以啦);
destroyItem(ViewGroup, int, Object)负责移除指定位置的页面;
isViewFromObject(View, Object)里直接写“return view == object;”即可(当然,如果你在instantiateItem(ViewGroup, int)里返回的不是View本身,那就不能这么写哦);
在描述中并未提及到getCount()方法,不过这个比较简单,也很常见,就是返回要展示的页面数量。
看了这么多理论知识,小伙伴们有没有想立刻动手写一下代码呢?于是我们回到刚才的项目,开始写一个适配器。我们新建一个类MyPagerAdapter。

MyPagerAdapter.java

package com.example.viewpagerdemo;

import java.util.List;

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

public class MyPagerAdapter extends PagerAdapter {

    private List<View> pageList;

    public MyPagerAdapter(List<View> pageList) {
        this.pageList = pageList;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub

        // 返回要展示的图片数量
        return pageList.size();
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        // TODO Auto-generated method stub

        // 刚开始用viewpager就直接写“return arg0 == arg1;”就好啦
        return arg0 == arg1;
    }

   ......

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        // TODO Auto-generated method stub

        // 将当前位置的View移除
        container.removeView(pageList.get(position));
    }
}

接下来就简单了,和所有的适配器一样,将viewpager与适配器绑定就可以了。

MainActivity.java

private MyPagerAdapter myPagerAdapter; // 适配器

......

myPagerAdapter = new MyPagerAdapter(pageList);
myViewPager.setAdapter(myPagerAdapter);

demo完整代码

package com.example.viewpagerdemo;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;

public class MainActivity extends Activity {

    private ViewPager myViewPager; // 要使用的ViewPager

    private View page1, page2, page3; // ViewPager包含的页面

    private List<View> pageList; // ViewPager包含的页面列表,一般给adapter传的是一个list

    private MyPagerAdapter myPagerAdapter; // 适配器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    private void initView() {
        // TODO Auto-generated method stub
        myViewPager = (ViewPager) findViewById(R.id.myViewPager);

        LayoutInflater inflater = getLayoutInflater();
        page1 = inflater.inflate(R.layout.page1, null);
        page2 = inflater.inflate(R.layout.page2, null);
        page3 = inflater.inflate(R.layout.page3, null);

        pageList = new ArrayList<View>();
        pageList.add(page1);
        pageList.add(page2);
        pageList.add(page3);

        myPagerAdapter = new MyPagerAdapter(pageList);
        myViewPager.setAdapter(myPagerAdapter);
    }

}