Android ViewPager PagerAdapter 图片轮播

  ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的View类。

  ViewPager类需要一个PagerAdapter适配器类给它提供数据。

  ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用。


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

  1.在住布局文件里加入

  2.加载要显示的页卡

  3.在Activity里实例化ViewPager组件,并设置它的Adapter(就是PagerAdapter,方法与ListView一样的),在这里一般需要重写PagerAdapter。

 

当你实现一个PagerAdapter,你必须至少覆盖以下方法:

  1. instantiateItem(ViewGroup, int) //返回视图对象

  2. destroyItem(ViewGroup, int, Object) //销毁视图对象

  3. getCount() //视图个数

  4. isViewFromObject(View, Object) //一般传入arg0==arg1.用来判断两个视图是否是等价的


XML配置

  <android.support.v4.view.ViewPager

    android:id="@+id/viewpager"  

    android:layout_width="wrap_content"

    android:layout_height="wrap_content" >  

  </android.support.v4.view.ViewPager>

 

 

在res/drawable下建立选择器

point_selector.xml 
 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:id="@+id/activity_main"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent">
 5 
 6     <LinearLayout
 7         android:layout_width="match_parent"
 8         android:layout_height="wrap_content"
 9         android:orientation="vertical">
10        <!-- <android.support.design.widget.TabLayout
11             android:id="@+id/tablelayout"
12             android:layout_width="match_parent"
13             android:layout_height="wrap_content" />-->
14 
15 
16         <android.support.v4.view.ViewPager
17             android:id="@+id/viewPager"
18             android:layout_width="match_parent"
19             android:layout_height="match_parent">
20             <!--系统默认PagerTabStrip和PagerTabStrip指示器的唯一区别是
21             PagerTabStrip可以点,PagerTabStrip不能点-->
22             <android.support.v4.view.PagerTabStrip
23                 android:id="@+id/pts"
24                 android:layout_width="match_parent"
25                 android:layout_height="wrap_content">
26 
27             </android.support.v4.view.PagerTabStrip>
28 
29         </android.support.v4.view.ViewPager>
30     </LinearLayout>
31     <LinearLayout
32         android:id="@+id/ll_points"
33         android:layout_width="wrap_content"
34         android:layout_height="wrap_content"
35         android:orientation="horizontal"
36         android:layout_alignParentBottom="true"
37         android:layout_marginBottom="50dp"
38         android:layout_centerHorizontal="true">
39 
40     </LinearLayout>
41 </RelativeLayout>
activity_main.xml
  1 public class MainActivity extends AppCompatActivity {
  2 
  3     ViewPager viewPager;
  4     Timer timer;
  5     LinearLayout ll_points;
  6     //TabLayout tablayout;
  7 
  8     @Override
  9     protected void onCreate(Bundle savedInstanceState) {
 10         super.onCreate(savedInstanceState);
 11         setContentView(R.layout.activity_main);
 12 
 13         viewPager = (ViewPager) findViewById(R.id.viewPager);
 14         initPoints();
 15 
 16         //tablayout = (TabLayout) findViewById(R.id.tablayout);
 17 
 18         viewPager.setAdapter(new MyPagerAdapter());
 19 
 20         //指示器也需要在设置适配器之后,还有默认不能设置成无限滚动,所以
 21         //tablayout.setupWithViewPager(viewPager);
 22 
 23         //必须在设置适配器之后设置默认中间页
 24         //viewPager.setCurrentItem(Integer.MAX_VALUE / 2);
 25 
 26         viewPager.setCurrentItem(Integer.MAX_VALUE / 2 - Integer.MAX_VALUE / 2 % 6);
 27         //viewPager.setCurrentItem(0);
 28         //设置自动轮播
 29         startAuto();
 30 
 31         viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
 32             @Override
 33             public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
 34                 //无限页
 35             }
 36 
 37             int currentIndex = 0;//一开始是第0页,已经被选中
 38             @Override
 39             public void onPageSelected(int position) {
 40                 //页面选择时
 41                 Toast.makeText(MainActivity.this,position+"页",Toast.LENGTH_SHORT).show();
 42                 ll_points.getChildAt(currentIndex).setSelected(false);
 43                 ll_points.getChildAt(position % 6).setSelected(true);
 44                 currentIndex = position % 6;
 45             }
 46 
 47             @Override
 48             public void onPageScrollStateChanged(int state) {
 49                 //状态改变
 50                 if (state == ViewPager.SCROLL_STATE_DRAGGING) {
 51                     //停止自动滚动
 52                 } else {
 53                     //开始滚动
 54                 }
 55             }
 56         });
 57 
 58     }
 59 
 60     private void initPoints() {
 61         ll_points = (LinearLayout) findViewById(R.id.ll_points);
 62         for (int i = 0; i < 6; i++) {
 63             View view = new View(getBaseContext());
 64             LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(20,20);
 65             params.setMargins(10,10,10,10);
 66             view.setBackgroundResource(R.drawable.point_selector);
 67             view.setLayoutParams(params);
 68             ll_points.addView(view);
 69         }
 70 
 71         //默认第0个被选中
 72         ll_points.getChildAt(0).setSelected(true);
 73 
 74     }
 75 
 76     public void startAuto(){
 77         //计时器
 78         timer = new Timer();
 79         timer.schedule(new TimerTask() {
 80             @Override
 81             public void run() {
 82                 //修改UI子线程中修改
 83                 runOnUiThread(new Runnable() {
 84                     @Override
 85                     public void run() {
 86                         viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
 87                     }
 88                 });
 89 
 90             }
 91         }, 3000, 3000);
 92     }
 93 
 94     public void stop(){
 95         if(timer != null){
 96             timer.cancel();
 97         }
 98     }
 99 
100     class MyPagerAdapter extends PagerAdapter {
101         //每一个ViewPager就是一个页面
102         List<View> mList = new ArrayList<>();
103         int[] imgId = new int[]{R.mipmap.img01, R.mipmap.img02, R.mipmap.img03, R.mipmap.img04, R.mipmap.img05, R.mipmap.img06};
104 
105         public MyPagerAdapter(){
106             for(int i=0; i<6; i++){
107                 ImageView img = new ImageView(getBaseContext());
108                 img.setImageResource(imgId[i]);
109                 img.setScaleType(ImageView.ScaleType.FIT_XY);
110                 mList.add(img);
111             }
112         }
113         @Override
114         public int getCount() {
115             //return mList.size();
116             //轮播设置最大值
117             return Integer.MAX_VALUE;
118         }
119 
120         @Override
121         public boolean isViewFromObject(View view, Object object) {
122             //判断两页是否相同,google要求这样写
123             return view == object;
124         }
125 
126         //加载视图对象,不要弄成View container的函数,这个已经是过期的了
127         @Override
128         public Object instantiateItem(ViewGroup container, int position) {
129             //添加视图到ViewGroup中
130             container.addView(mList.get(position % 6));
131             return mList.get(position % 6);
132         }
133 
134         //销毁一个视图
135         @Override
136         public void destroyItem(ViewGroup container, int position, Object object) {
137             container.removeView(mList.get(position % 6));
138         }
139 
140         String[] titles = {"第一页","第二页","第三页","第四页","第五页","第六页"};
141 
142         //给定系统的指示器的时候,需要重写getPageTitle方法
143         @Override
144         public CharSequence getPageTitle(int position) {
145             return titles[position % 6];
146         }
147     }
148 
149 }
MainActivity.java

 

 下面是使用

  android.support.design.widget.TabLayout的效果,需要导入jar studio可以远程依赖

  在布局中添加TabLayout
  在viewPager设置适配器后,调用setupWithViewPager(vp);但是默认不能设置无限页滚动

 

posted on 2016-10-25 19:15  语风6649  阅读(3350)  评论(0编辑  收藏  举报

导航