Android 无限循环且支持自动滚动的ViewPager
来源:互联网 发布:手机淘宝应聘客服 编辑:程序博客网 时间:2024/05/12 09:26
无限循环思路:
1. 添加最后一条数据到第一条,添加第一条数据到最后一条;
2.滚动到最后一页,自动跳到第二页(视觉上的第一页),滚动到第一页,自动跳转至倒数第二页(视觉上最后一页);
3.初始设置滚动到第二页(视觉上的第一页);
自动滚动思路:
使用定时器自动向右滚动。
具体实现
public class LoopPagerAdapter extends PagerAdapter implements ViewPager.OnPageChangeListener { private static final String TAG = "LoopPagerAdapter"; private Context context; /**是否循环*/ private boolean isLoop; /**viewpager*/ private ViewPager viewPager; /**view布局文件*/ private List<Integer> resources; /**View数据源*/ private List<View> views; /**当前页面*/ private int currentPosition = 0; /**定时器*/ private Timer timer; private MyHandler handler; /** * * @param context 上下文 * @param resources view布局列表 * @param vp viewpager */ public LoopPagerAdapter(Context context, List<Integer> resources, ViewPager vp){ this.context = context; this.resources = resources; this.viewPager = vp; init(); } /** * * @param context 上下文 * @param resources view布局列表 * @param isLoop 是否循环滚动 * @param vp viewpager */ public LoopPagerAdapter(Context context, List<Integer> resources, boolean isLoop, ViewPager vp){ this.context = context; this.context = context; this.resources = resources; this.isLoop = isLoop; this.viewPager = vp; addLoopViews(); init(); } private void addLoopViews(){ if(views == null){ views = new ArrayList<>(); } LayoutInflater inflater = LayoutInflater.from(context); for(Integer id : resources){ views.add(inflater.inflate(id, null)); } int size = views.size(); //如果不是循环,view数量只有1个,则不处理 if(!isLoop || size <= 1){ return; } //第一页view View firstView = inflater.inflate(resources.get(0), null); //尾页view View endView = inflater.inflate(resources.get(size-1), null); //添加一个尾页到第一页 views.add(0, endView); //添加一个首页到最后一页 views.add(firstView); } private void init(){ viewPager.setAdapter(this); viewPager.addOnPageChangeListener(this); viewPager.setCurrentItem(1, false); } @Override public int getCount() { return views.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { View view = views.get(position); container.addView(view); return views.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(views.get(position)); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { this.currentPosition = position; } @Override public void onPageScrollStateChanged(int state) { //如果还在滑动中或非循环不做处理 if(state != ViewPager.SCROLL_STATE_IDLE || !isLoop){ return; } //如果当前页面为第一张,则设置页面为倒数第二张 if(currentPosition == 0){ viewPager.setCurrentItem(views.size()-2, false); }else if(currentPosition == views.size() - 1){//若当前为倒数第一张,设置页面为第二张 viewPager.setCurrentItem(1, false); } } /** * 开始自动滚动 * @param delay 等待时间 * @param period 间隔时间 */ public void startAutoScrollPage(long delay, long period){ handler = new MyHandler(this); timer = new Timer(); timer.schedule(new MyTask(this), delay, period); } /** * 停止自动滚动 */ public void stopAutoScrollPage(){ if(timer != null){ timer.cancel(); } if(handler != null){ handler.removeCallbacksAndMessages(null); } } /** * 自动滚动handler */ private static class MyHandler extends Handler { private WeakReference<LoopPagerAdapter> weakReference; public MyHandler(LoopPagerAdapter adapter){ weakReference = new WeakReference<>(adapter) ; } @Override public void handleMessage(Message msg) { if(weakReference.get() == null){ return; } LoopPagerAdapter adapter = weakReference.get(); adapter.viewPager.arrowScroll(adapter.viewPager.FOCUS_RIGHT); } } /** * 定时器 */ private static class MyTask extends TimerTask { private WeakReference<LoopPagerAdapter> weakReference; public MyTask(LoopPagerAdapter adapter){ weakReference = new WeakReference<>(adapter); } @Override public void run() { if(weakReference.get() == null){ return; } LoopPagerAdapter adapter = weakReference.get(); adapter.handler.sendMessage(new Message()); } }}
使用
vp = (ViewPager) findViewById(R.id.activity_main_vp); List<Integer> ids = new ArrayList<>(); ids.add(R.layout.view_vp1); ids.add(R.layout.view_vp2); ids.add(R.layout.view_vp3); LoopPagerAdapter adapter = new LoopPagerAdapter(getApplicationContext(), ids, true, vp); adapter.startAutoScrollPage(3000, 3000);
效果
阅读全文
0 0
- Android 无限循环且支持自动滚动的ViewPager
- android viewpager实现无限循环自动滚动
- Android ViewPager的无限循环与自动滚动实现
- ViewPager无限循环,自动滚动,兼容PageIndicator的ViewPager
- Android无限循环滚动ViewPager
- 关于自动滚动无限循环viewpager的问题
- android简单实现无限滚动,自动滚动的ViewPager
- Android 一个无限循环滚动的卡片式ViewPager
- 【Android】ViewPager实现无限循环滚动
- Android实现ViewPager无限循环滚动回绕
- viewpager无限循环滚动遇到的坑
- Android自动滚动 轮播循环的ViewPager
- Android自动滚动 轮播循环的ViewPager
- Android自动滚动 轮播循环的ViewPager
- Android自动滚动 轮播循环的ViewPager
- Android自动滚动 轮播循环的ViewPager
- Android自动滚动 轮播循环的ViewPager
- Android无限循环ViewPager
- 迭代器、推导式、函数式编程学习笔记
- callback
- Android 获取wifi状态 Wifi控制 主动连接wifi
- 6.4 计算机网络课程
- BZOJ:4300 绝世好(sb)题
- Android 无限循环且支持自动滚动的ViewPager
- android scheme 跳转应用 如何获取intent传的参数
- 关于建立内部会议讨论规范的想法
- linux 查看内核版本
- 堆排序原理及算法实现(最大堆)
- 实战
- IOS的归档小总结
- SVM学习(一):SVM概念
- ckplayer(超酷网页视频播放器)