ViewPager是在android.support.v4扩展提供的一个类,用于实现页面切换,导航等等,它里面主要是通过Scroller和PagerAdapter达到左右滑动页面切换的效果。
一、ViewPager使用步骤
(1) xml文件定义ViewPager
Eg:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</FrameLayout>
..........
setContentView(R.layout.activity_testviewpager);
viewPager = (ViewPager) findViewById(R.id.viewPager);
(2) 定义PagerAdapter的子类
继承PagerAdapter,至少必须重写下面的四个方法
public Object instantiateItem(View container, int position) //根据给定的postion创建页面,适配器负责向container添加view
public void destroyItem(View container, int position, Object object) //View的回收处理,此方法被调用时机:在页面进行切换的时候距离当前位置2个步幅(包括2个步幅)以上的那个View销毁,就会触发destroyItem方法
以上两个方法instantiateItem,destroyItem如果子类没有覆盖会抛出运行期异常: UnsupportedOperationException("Required method destroyItem was not overridden")
public abstract boolean isViewFromObject(View view, Object object)//用来判断pager的一个view是否和instantiateItem方法返回的object有关联,这里object参数对应 instantiateItem方法返回的
public abstract int getCount() //返回可见view的个数
其中两个方法没有被覆盖则会抛运行期异常,其中两个是抽象方法,所以必须覆盖以上有四个方法
Eg:
<pre name="code" class="java">public class ViewPagerAdapter extends PagerAdapter
{
private List<View> images;
public ViewPagerAdapter(List<View> images)
{
this.images = images;
}
@Override
public int getCount()
{
return images.size();
}
public boolean isViewFromObject(View arg0, Object arg1)
{
return arg0 == arg1;
}
// PagerAdapter只缓存三张要显示的图片,如果滑动的图片超出了缓存的范围,就会调用这个方法,将图片销毁
@Override
public void destroyItem(ViewGroup view, int position, Object object)
{
view.removeView(images.get(position));
}
// 当要显示的图片可以进行缓存的时候,会调用这个方法进行显示图片的初始化,我们将要显示的ImageView加入到ViewGroup中,然后作为返回值返回即可
@Override
public Object instantiateItem(ViewGroup view, int position)
{
view.addView(images.get(position));
return images.get(position);
}
}
(3) 设置adapter
viewPager.setAdapter(new ViewPagerAdapter (images));
(4)设置当前显示位置
viewPager.setCurrentItem(0);
二、ViewPager 特点
(1) ViewPager最多管理3个页面
(2) PagerAdapter在初始化时调用几次instantiateItem和当前位置position有关系(setCurrentItem(int position)):
eg:有3条数据,position处于以下:
position = 0 (最左边) --> 初始化2个(当前位置的右边View,position=1),调用instantiateItem方法2次
position = 1 (中间) --> 初始化3个(当前位置的两边View,position=0,position=2),调用instantiateItem方法3次
position = 2 (最右边)--> 初始化2个(当前位置的左边View,position=1),调用instantiateItem方法2次
所以初始化的时候instantiateItem最多被调用3次。
(3) destroyItem方法调用时机
在进行滑动切换的时候,距离当前位置2个步幅(包括2个步幅)以上的View会被销毁;如果只有1条或2条数据(3条数据以下),那么destroyItem方法是不会被调用的。
参考:
http://blog.csdn.net/leo8573/article/details/7893841
http://www.cnblogs.com/xinye/archive/2013/06/09/3129140.html
http://www.it165.net/pro/html/201403/11289.html