一、概述
ViewPager是android扩展包v4包(android.support.v4.view.ViewPager)中的类,这个类可以让用户左右切换当前的view。
ViewPager特点:
1)ViewPager类直接继承了ViewGroup类,所以它是一个容器类,可以在其中添加其他的view类。
2)ViewPager类需要一个PagerAdapter适配器类(通常需要自定义适配器继承PagerAdapter类重写其中的方法)给它提供数据。
3)ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用。
二、关键方法
setCurrentItem(int position) 显示第position页的View(界面) setAdapter() 设置ViewPager的适配器,参数为是适配器 setOnPageChangeListener() 设置页面改变事件监听事件 setOffscreenPageLimit(int limit) 设置脱离屏幕的页面限制--最多同时显示的页面数
三、适配器
ViewPager相关适配器:
1、PagerAdapter 需要重写getCount(),isViewFromObject()方法,添加instantiateItem(),destroyItem()方法
2、FragmentPagerAdapter和FragmentStatePagerAdapter
区别:
FragmentPagerAdapter //这个适配器当前fragment(正在显示的)和其他fragment(a)(未显示的)间隔超过一个fragment的距离,则销毁fragment(a)的View,fragment(a)不销毁
FragmentStatePagerAdapter //这个适配器当前fragment(正在显示的)和其他fragment(a)(未显示的)间隔超过一个fragment的距离,则销毁fragment(a)
四、通过简单的Demo学习ViewPager的使用步骤
1、在布局文件中使用<android.support.v4.view.ViewPager>标签
1 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 > 6 7 <android.support.v4.view.ViewPager //用于显示ViewPager 8 android:layout_width="wrap_content" 9 android:layout_height="wrap_content" 10 android:id="@+id/viewPager" 11 /> 12 13 </FrameLayout>
2、代码中增加显示的页面(创建一个存放View的集合,向集合中添加的View就是要显示的View,比如三个界面都是ImageView),
1 View views = new ArrayList<View>(); 2 int image[] = new int[]{R.drawable.a1,R.drawable.a2,R.drawable.a3}; //这里三张图片分别是红,黄,蓝色的图片 3 for(int i=1;i<=3;i++) 4 { 5 //实例化中ViewPager中要显示的图片控件 6 imageView = new ImageView(getApplicationContext()); 7 //设置图片格式 8 imageView.setScaleType(ScaleType.CENTER_CROP); 9 imageView.setImageResource(image[i-1]); 10 views.add(imageView); 11 }
3、在Activity里实例化ViewPager组件,并设置它的Adapter(即PagerAdapter)
1 //实例化适配器 2 MyPagerAdapter adapter = new MyPagerAdapter(); 3 //设置适配器 4 5 viewPager.setAdapter(adapter); 6 7 //声明PagerAdapter子类,用于管理ViewPager中显示的View控件,重写四个方法 8 class MyPagerAdapter extends PagerAdapter 9 { 10 11 @Override 12 public int getCount() { 13 // TODO Auto-generated method stub 14 return views.size(); 15 } 16 17 //判断当前显示的UI对象是否和数据对象一致 18 @Override 19 public boolean isViewFromObject(View arg0, Object arg1) { 20 // TODO Auto-generated method stub 21 return arg0 == arg1; 22 } 23 24 @Override 25 public Object instantiateItem(ViewGroup container, int position) { 26 //获得指定位置的View,并增加到ViewPager中,同时作为当前页面的数据返回 27 container.addView(views.get(position)); 28 return views.get(position); 29 30 } 31 32 @Override 33 public void destroyItem(ViewGroup container, int position, Object object) { 34 //当前位置和ViewPager中正显示的页面的位置的间隔是否超出一个页面,是则将当前页面移除 35 container.removeView(views.get(position)); 36 } 37 38 39 } 40
完整java代码:
1 package com.example.myviewpager; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import android.app.Activity; 7 import android.os.Bundle; 8 import android.support.v4.view.PagerAdapter; 9 import android.support.v4.view.ViewPager; 10 import android.support.v4.view.ViewPager.OnPageChangeListener; 11 import android.view.Menu; 12 import android.view.View; 13 import android.view.ViewGroup; 14 import android.widget.ImageView; 15 import android.widget.ImageView.ScaleType; 16 17 public class MainActivity extends Activity { 18 19 private ImageView imageView; 20 //自定义Pager适配器继承PagerAdapter 21 private MyPagerAdapter adapter; 22 // ViewPager控件 23 private ViewPager viewPager; 24 //存放View类数据的集合 25 private List<View> views; 26 27 28 @Override 29 protected void onCreate(Bundle savedInstanceState) { 30 super.onCreate(savedInstanceState); 31 setContentView(R.layout.activity_main); 32 33 viewPager = (ViewPager) findViewById(R.id.viewPager); 34 35 initView(); 36 37 } 38 39 private void initView() { 40 //加载ViewPager中显示的页面 41 //实例化集合 42 views = new ArrayList<View>(); 43 int image[] = new int[]{R.drawable.a1,R.drawable.a2,R.drawable.a3}; 44 45 for(int i=1;i<=3;i++) 46 { 47 //实例化中ViewPager中要显示的图片控件 48 imageView = new ImageView(getApplicationContext()); 49 //设置图片格式 50 imageView.setScaleType(ScaleType.CENTER_CROP); 51 imageView.setImageResource(image[i-1]); 52 views.add(imageView); 53 54 } 55 //实例化适配器 56 adapter = new MyPagerAdapter(); 57 //设置适配器 58 59 viewPager.setAdapter(adapter); 60 //设置移除UI的间隔大小,默认为1 61 // viewPager.setOffscreenPageLimit(3); 62 63 } 64 65 //声明PagerAdapter子类,用于管理ViewPager中显示的View控件 66 class MyPagerAdapter extends PagerAdapter 67 { 68 69 @Override 70 public int getCount() { 71 // TODO Auto-generated method stub 72 return views.size(); 73 } 74 75 //判断当前显示的UI对象是否和数据对象一致 76 @Override 77 public boolean isViewFromObject(View arg0, Object arg1) { 78 // TODO Auto-generated method stub 79 return arg0 == arg1; 80 } 81 82 @Override 83 public Object instantiateItem(ViewGroup container, int position) { 84 //获得指定位置的View,并增加到ViewPager中,同时作为当前页面的数据返回 85 container.addView(views.get(position)); 86 return views.get(position); 87 88 } 89 90 @Override 91 public void destroyItem(ViewGroup container, int position, Object object) { 92 //当前位置和ViewPager中正显示的页面的位置的间隔是否超出一个页面,是则将当前页面移除 93 container.removeView(views.get(position)); 94 } 95 96 97 } 98 99 100 @Override 101 public boolean onCreateOptionsMenu(Menu menu) { 102 // Inflate the menu; this adds items to the action bar if it is present. 103 getMenuInflater().inflate(R.menu.main, menu); 104 return true; 105 } 106 107 }