Android使用ViewPager实现无限循环滑动及轮播(附源码)


MainActivity如下:

  1 package cc.ww;  
  2   
  3 import java.util.ArrayList;  
  4   
  5 import android.app.Activity;  
  6 import android.content.Context;  
  7 import android.os.Bundle;  
  8 import android.os.Handler;  
  9 import android.os.Message;  
 10 import android.support.v4.view.ViewPager;  
 11 import android.view.MotionEvent;  
 12 import android.view.View;  
 13 import android.view.ViewGroup;  
 14 import android.view.Window;  
 15 import android.view.WindowManager;  
 16 import android.view.View.OnTouchListener;  
 17 import android.widget.ImageView;  
 18 import android.widget.LinearLayout;  
 19 /** 
 20  * 原创作者: 
 21  * 谷哥的小弟 http://blog.csdn.net/lfdfhl 
 22  *  
 23  * Demo描述: 
 24  * 1 ViewPager的自动轮播 
 25  * 2 同时支持手动切换ViewPager的Item 
 26  * 3 解决了当图片小于三张ViewPager轮播时崩溃的问题 
 27  */  
 28 public class MainActivity extends Activity {  
 29     private Context mContext;  
 30     private Handler mHandler;  
 31     private Runnable mRunnable;  
 32     private ViewPager mViewPager;  
 33     private int viewPagerItemSize=0;  
 34     private ImageView[] dotImageViews;  
 35     private final int INTERVAL =1000 * 3;  
 36     private ArrayList<Integer> mArrayList;  
 37     private LinearLayout mDotsLinearLayout;  
 38     private final static int SET_VIEWPAGER_ITEM=9527;  
 39     private LauncherViewPagerAdapter mViewPagerAdapter;  
 40     private PageChangeListenerImpl mPageChangeListenerImpl;  
 41       
 42     @Override  
 43     protected void onCreate(Bundle savedInstanceState) {  
 44         super.onCreate(savedInstanceState);  
 45         //去掉状态栏  
 46         requestWindowFeature(Window.FEATURE_NO_TITLE);  
 47         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
 48                              WindowManager.LayoutParams.FLAG_FULLSCREEN);  
 49         setContentView(R.layout.activity_main);  
 50         init();  
 51     }  
 52       
 53       
 54     //初始化  
 55     private void init() {  
 56         initData();  
 57         if(viewPagerItemSize>0){  
 58             initDots();  
 59             initViewPager();  
 60             setAutoChangeViewPager();  
 61         }  
 62     }  
 63       
 64       
 65     //准备ViewPager将显示的数据  
 66     private void initData(){  
 67         mContext = this;  
 68         mArrayList=new ArrayList<Integer>();  
 69         mArrayList.add(R.drawable.a);  
 70         mArrayList.add(R.drawable.b);  
 71         mArrayList.add(R.drawable.c);  
 72         mArrayList.add(R.drawable.d);  
 73         viewPagerItemSize=mArrayList.size();  
 74     }  
 75       
 76       
 77     //初始化ViewPager  
 78     private void initViewPager(){  
 79         mViewPager = (ViewPager) findViewById(R.id.guide_viewpager);  
 80         mViewPagerAdapter = new LauncherViewPagerAdapter(mContext);  
 81         mViewPagerAdapter.setAdapterData(mArrayList);  
 82         mViewPager.setAdapter(mViewPagerAdapter);  
 83         int currentItem = Integer.MAX_VALUE/2 - Integer.MAX_VALUE/2 % viewPagerItemSize;  
 84         mViewPager.setCurrentItem(currentItem);  
 85         setdotImageViews(currentItem%viewPagerItemSize);  
 86         mViewPager.setOnTouchListener(new OnTouchListener() {  
 87             @Override  
 88             public boolean onTouch(View arg0, MotionEvent arg1) {  
 89                 mViewPager.requestDisallowInterceptTouchEvent(true);  
 90                 return false;  
 91             }  
 92         });  
 93     }  
 94       
 95   
 96     //初始化底部小圆点  
 97     private void initDots() {  
 98         mDotsLinearLayout = (LinearLayout) findViewById(R.id.dotsLinearLayout);  
 99         dotImageViews = new ImageView[viewPagerItemSize];  
100         for (int i = 0; i < dotImageViews.length; i++) {  
101             LinearLayout layout = new LinearLayout(mContext);  
102             ImageView imageView = new ImageView(mContext);  
103             imageView.setLayoutParams(new ViewGroup.LayoutParams(20, 20));  
104             if (i == 0) {  
105                 imageView.setBackgroundResource(R.drawable.guide_dot_white);  
106             } else {  
107                 layout.setPadding(20, 0, 0, 0);  
108                 imageView.setBackgroundResource(R.drawable.guide_dot_black);  
109             }  
110             dotImageViews[i] = imageView;  
111             layout.addView(imageView);  
112             mDotsLinearLayout.addView(layout);  
113         }  
114     }  
115       
116       
117     //开启ViewPager的自动轮播  
118     @SuppressWarnings("deprecation")  
119     private void setAutoChangeViewPager() {  
120         mPageChangeListenerImpl = new PageChangeListenerImpl();  
121         mViewPager.setOnPageChangeListener(mPageChangeListenerImpl);  
122   
123         mHandler = new Handler() {  
124             @Override  
125             public void handleMessage(Message msg) {  
126                 super.handleMessage(msg);  
127                 switch (msg.what) {  
128                 case SET_VIEWPAGER_ITEM:  
129                     if (mViewPager != null && mViewPagerAdapter != null) {  
130                         int currentItemIndex = mViewPager.getCurrentItem();  
131                         int itemsCount = mViewPagerAdapter.getCount();  
132                         if ((currentItemIndex + 1) < itemsCount) {  
133                             mViewPager.setCurrentItem(currentItemIndex + 1, true);  
134                         } else {  
135                             mViewPager.setCurrentItem(0, false);  
136                         }  
137                     }  
138                     break;  
139                 }  
140             }  
141         };  
142   
143         mRunnable = new Runnable() {  
144             @Override  
145             public void run() {  
146                 Message message = mHandler.obtainMessage();  
147                 message.what = SET_VIEWPAGER_ITEM;  
148                 mHandler.sendMessage(message);  
149                 mHandler.removeCallbacks(mRunnable);  
150                 mHandler.postDelayed(this, INTERVAL);  
151             }  
152         };  
153   
154         mHandler.postDelayed(mRunnable, INTERVAL);  
155     }  
156       
157       
158     //设置小圆点的显示  
159     private void setdotImageViews(int selected){  
160          for (int i = 0; i < dotImageViews.length; i++) {  
161              dotImageViews[selected].setBackgroundResource(R.drawable.guide_dot_white);  
162              if (selected != i) {  
163                  dotImageViews[i].setBackgroundResource(R.drawable.guide_dot_black);  
164              }  
165          }  
166     }  
167       
168     //ViewPager翻页后更新小圆点的显示  
169     private class PageChangeListenerImpl implements ViewPager.OnPageChangeListener {  
170         @Override  
171         public void onPageSelected(int selected) {  
172              setdotImageViews(selected % viewPagerItemSize);  
173         }  
174   
175         @Override  
176         public void onPageScrolled(int arg0, float arg1, int arg2) {  
177         }  
178   
179         @Override  
180         public void onPageScrollStateChanged(int state) {  
181               
182         }  
183   
184     }  
185       
186     @Override  
187     protected void onDestroy() {  
188         super.onDestroy();  
189         if(null!=mViewPager){  
190             mViewPager.removeAllViews();  
191             mViewPager = null;  
192         }  
193     }  
194       
195 }  

LauncherViewPagerAdapter如下:

 1 package cc.ww;  
 2   
 3 import java.util.ArrayList;  
 4 import android.content.Context;  
 5 import android.support.v4.view.PagerAdapter;  
 6 import android.view.LayoutInflater;  
 7 import android.view.View;  
 8 import android.view.ViewGroup;  
 9 import android.widget.ImageView;  
10 import android.widget.Toast;  
11   
12 public class LauncherViewPagerAdapter extends PagerAdapter {  
13     private Context mContext;  
14     private ArrayList<Integer> pagesArrayList;  
15     private View itemView;  
16   
17     public LauncherViewPagerAdapter(Context context) {  
18         this.mContext = context;  
19     }  
20       
21     /** 
22      * 设置ViewPager将要显示的数据. 
23      * 当图片数量小于三张的时候,通过复制组拼数据 
24      */  
25     public void setAdapterData(ArrayList<Integer> arrayList){  
26         pagesArrayList=arrayList;  
27         if (pagesArrayList.size()<1) {  
28             Toast.makeText(mContext, "ViewPager item size=0", Toast.LENGTH_LONG).show();  
29         }else if(pagesArrayList.size()<2){  
30              pagesArrayList.add(pagesArrayList.get(0));  
31              pagesArrayList.add(pagesArrayList.get(0));  
32              pagesArrayList.add(pagesArrayList.get(0));  
33         }else if(pagesArrayList.size()<3){  
34             pagesArrayList.add(pagesArrayList.get(0));  
35             pagesArrayList.add(pagesArrayList.get(1));  
36         }  
37         System.out.println("-----> PagerAdapter中item的个数="+pagesArrayList.size());  
38     }  
39       
40   
41     @Override  
42     public int getCount() {  
43          return Integer.MAX_VALUE;  
44     }  
45       
46   
47     @Override  
48     public Object instantiateItem(ViewGroup container, int position) {  
49          if (pagesArrayList.size() > 0) {  
50             itemView=LayoutInflater.from(mContext).inflate(R.layout.guide_pager_adapter, null);  
51             itemView.setFocusable(true);  
52             ImageView imageView = (ImageView) itemView.findViewById(R.id.imageView);  
53             imageView.setBackgroundResource(pagesArrayList.get(position%pagesArrayList.size()));  
54             container.addView(itemView);  
55             return itemView;  
56          }  
57          return null;  
58           
59     }  
60   
61   
62     @Override  
63     public boolean isViewFromObject(View arg0, Object arg1) {  
64         return arg0 == arg1;  
65     }  
66   
67     @Override  
68     public void destroyItem(ViewGroup container, int position, Object object) {  
69          container.removeView((View) object);  
70     }  
71 }  

activity_main.xml如下:

 1 <RelativeLayout 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     <android.support.v4.view.ViewPager  
 7         android:id="@+id/guide_viewpager"  
 8         android:layout_width="match_parent"  
 9         android:layout_height="match_parent" />  
10   
11     <LinearLayout  
12         android:id="@+id/dotsLinearLayout"  
13         android:layout_width="wrap_content"  
14         android:layout_height="wrap_content"  
15         android:layout_alignParentBottom="true"  
16         android:layout_marginBottom="100px"  
17         android:layout_centerHorizontal="true"  
18         android:orientation="horizontal">  
19     </LinearLayout>  
20       
21   
22   
23 </RelativeLayout>  

guide_pager_adapter.xml如下:

 1 <?xml version="1.0" encoding="utf-8"?>  
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
 3     android:layout_width="match_parent"  
 4     android:layout_height="match_parent">  
 5   
 6     <ImageView  
 7         android:id="@+id/imageView"  
 8         android:layout_width="match_parent"  
 9         android:layout_height="match_parent" />  
10   
11 </RelativeLayout>  

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM