ViewPager实现滑屏的无限循环

实现ViewPager无限循环:

1.让ViewPager的PagerAdapter无限大且内容重复

2.实现自动滚屏控制器

上源码:

  1 /**
  2  * ViewPager无限循环实现
  3  * 1、实现一个无限大的PagerAdapter 
  4  * 2、继承ViewPager重写setAdapter方法
  5  * 3、实现一个自动滚屏的控制器
  6  * 注意:数据刷新调用LoopViewPager类里的notifyDataSetChanged 
  7  * @author sdsw
  8  *
  9  */
 10 public class LoopViewPager extends ViewPager implements Runnable {
 11 
 12     //无限大的PagerAdapter
 13     private LoopPagerAdapter loopAdapter;
 14     private PagerAdapter adapter;
 15 
 16     //自动滚屏时间间隔
 17     private int POST_DELAYED_TIME = 2000;
 18     //自动滚屏开关
 19     private boolean isLoop = true;
 20     //解决notifyDataSetChanged不刷新数据问题
 21     private boolean isNotify = false;
 22 
 23     public LoopViewPager(Context context, AttributeSet attrs) {
 24         super(context, attrs);
 25         // TODO Auto-generated constructor stub
 26     }
 27 
 28     @Override
 29     public void setAdapter(PagerAdapter adapter) {
 30         // TODO Auto-generated method stub
 31         if (adapter != null) {
 32             //修改PagerAdapter为无限大
 33             loopAdapter = new LoopPagerAdapter(adapter);
 34             this.adapter = adapter;
 35         }
 36         super.setAdapter(loopAdapter);
 37         startLoop();
 38     }
 39 
 40     @Override
 41     public PagerAdapter getAdapter() {
 42         // TODO Auto-generated method stub
 43         return adapter;
 44     }
 45 
 46     public LoopPagerAdapter getLoopAdapter() {
 47         // TODO Auto-generated method stub
 48         return loopAdapter;
 49     }
 50 
 51     /**
 52      * 解决数据刷新问题
 53      */
 54     public void notifyDataSetChanged() {
 55         isNotify = true;
 56         loopAdapter.notifyDataSetChanged();
 57         if(isLoop) {
 58             stopLoop();
 59             startLoop();
 60         }
 61     }
 62 
 63     /**
 64      * 设置自动滚屏时间
 65      * @param time
 66      */
 67     public void setLoopTime(int time) {
 68         POST_DELAYED_TIME = time;
 69     }
 70 
 71     /**
 72      * 开启和关闭滚屏
 73      * @param isLoop
 74      */
 75     public void setLoop(boolean isLoop) {
 76         this.isLoop = isLoop;
 77         if (isLoop) {
 78             startLoop();
 79         } else {
 80             startLoop();
 81         }
 82     }
 83 
 84     private void startLoop() {
 85         stopLoop();
 86         postDelayed(this, POST_DELAYED_TIME);
 87     }
 88 
 89     private void stopLoop() {
 90         removeCallbacks(this);
 91     }
 92     
 93     /**
 94      * 获取当前的item
 95      * @return
 96      */
 97     public int getLoopCurrentItem(){
 98         int curent_item = 0;
 99         if(adapter != null && getCurrentItem() != 0 && adapter.getCount() != 0) {
100             if(getCurrentItem() >= adapter.getCount()) {
101                 curent_item = getCurrentItem() % adapter.getCount();
102             }
103         }
104         return curent_item;
105     }
106 
107     @Override
108     // 自动滚动关键
109     public void run() {
110         if (!isLoop) {
111             return;
112         }
113         if (getAdapter() != null && getAdapter().getCount() > 1) {
114             setCurrentItem(getCurrentItem() + 1);
115         }
116         startLoop();
117     }
118 
119     /**
120      * 当touch时取消自动滚动
121      */
122     @Override
123     public boolean onTouchEvent(MotionEvent event) {
124         if (event.getAction() == MotionEvent.ACTION_DOWN) {
125             stopLoop();
126         } else if (event.getAction() == MotionEvent.ACTION_UP
127                 || event.getAction() == MotionEvent.ACTION_CANCEL) {
128             if (isLoop) {
129                 startLoop();
130             }
131         }
132         return super.onTouchEvent(event);
133     }
134 
135     /**
136      * 无限大的pagerAdapter
137      * @author sdsw
138      *
139      */
140     class LoopPagerAdapter extends PagerAdapter {
141 
142         private PagerAdapter adapter;
143 
144         public LoopPagerAdapter(PagerAdapter adapter) {
145             this.adapter = adapter;
146         }
147 
148         @Override
149         public int getCount() {
150             // TODO Auto-generated method stub
151             return Integer.MAX_VALUE;
152         }
153 
154         @Override
155         public boolean isViewFromObject(View arg0, Object arg1) {
156             // TODO Auto-generated method stub
157             return adapter.isViewFromObject(arg0, arg1);
158         }
159 
160         @Override
161         public void destroyItem(ViewGroup container, int position, Object object) {
162             // TODO Auto-generated method stub
163             int count = adapter.getCount();
164             int new_position = 0;
165             if (count != 0)
166                 new_position = position % adapter.getCount();
167             adapter.destroyItem(container, new_position, object);
168         }
169 
170         @Override
171         public Object instantiateItem(ViewGroup container, int position) {
172             // TODO Auto-generated method stub
173             int count = adapter.getCount();
174             int new_position = 0;
175             if (count != 0)
176                 new_position = position % adapter.getCount();
177             return adapter.instantiateItem(container, new_position);
178         }
179 
180         @Override
181         public int getItemPosition(Object object) {
182             if (isNotify) {
183                 isNotify = false;
184                 return POSITION_NONE;
185             }
186             return super.getItemPosition(object);
187         }
188     }
189 
190 }

 

posted @ 2014-12-18 11:11  宋文  阅读(2732)  评论(1编辑  收藏  举报