Android自动轮播的三种方式
方法一:在runable里判断,不是最后条目的时候++,是的话=0,获取当前条目,给viewpager设置,然后在runable里递归post,在外面也post这个run
// 自动轮播条显示 if (mHandler == null) { mHandler = new Handler() { public void handleMessage(android.os.Message msg) { int currentItem = mViewPager.getCurrentItem(); if (currentItem < mTopNewsList.size() - 1) { currentItem++; } else { currentItem = 0; } mViewPager.setCurrentItem(currentItem);// 切换到下一个页面 // 继续延时3秒发消息,形成循环,可以handleMessage方法里发送消息的 mHandler.sendEmptyMessageDelayed(0, 3000); }; }; mHandler.sendEmptyMessageDelayed(0, 3000);// 延时3秒后发消息 } .... class TopNewsTouchListener implements OnTouchListener { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println("按下"); // 删除Handler中的所有消息,Callbacks是说有个postDelayed,传的是Runnable,这么这个方法每几秒执行一次 mHandler.removeCallbacksAndMessages(null); // mHandler.postDelayed(new Runnable() { // // @Override // public void run() { // // } // }, 3000); break; case MotionEvent.ACTION_CANCEL: //因为当按下没抬起,而是滑了一下,那么事件就取消了,需要重新发送一下 System.out.println("事件取消"); mHandler.sendEmptyMessageDelayed(0, 3000); break; case MotionEvent.ACTION_UP: System.out.println("抬起"); mHandler.sendEmptyMessageDelayed(0, 3000); break; default: break; } return true; } }
方法二:在设置adapter的getposotion方法里返回整数的最大值,写个runable一直然后pager的当前条目++,然后递归调用post,在外面也post,在外边是第一次调用。在初始化view的时候设置pager的当前条目写个list的整数倍,因为有可能错乱,这样的话在第一页也能向后划了。
/* 当 holder.setData 才会调用 */ @Override public void refreshView(List<String> datas) { this.datas = datas; viewPager.setAdapter(new HomeAdapter()); viewPager.setCurrentItem(2000*datas.size());// 设置起始的位置 Integer.Max_Vlue/2,这样开始位置也能向后划了 viewPager.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: runTask.stop(); break; // 事件的取消,有可能按下viewpager滑动到listview上停止就不轮播了 case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: runTask.start(); break; } return false; // viewPager 触摸事件 返回值要是false } }); runTask = new AuToRunTask(); runTask.start(); } boolean flag; private AuToRunTask runTask; //Runnable并不是开启子线程,所以可以在主线程运行,thread才是开启线程 public class AuToRunTask implements Runnable{ @Override public void run() { if(flag){ UiUtils.cancel(this); // 取消之前 int currentItem = viewPager.getCurrentItem(); currentItem++; viewPager.setCurrentItem(currentItem); // 延迟执行当前的任务 UiUtils.postDelayed(this, 2000);// 递归调用 } } public void start(){ if(!flag){ UiUtils.cancel(this); // 取消之前 flag=true; UiUtils.postDelayed(this, 2000);// 递归调用 } } public void stop(){ if(flag){ flag=false; UiUtils.cancel(this); } } } class HomeAdapter extends PagerAdapter { // 当前viewPager里面有多少个条目 LinkedList<ImageView> convertView=new LinkedList<ImageView>(); // ArrayList @Override public int getCount() { return Integer.MAX_VALUE;//这样写条目就能一直划了 } /* 判断返回的对象和 加载view对象的关系 */ @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public void destroyItem(ViewGroup container, int position, Object object) { ImageView view=(ImageView) object; convertView.add(view);// 把移除的对象 添加到缓存集合中 container.removeView(view); } @Override public Object instantiateItem(ViewGroup container, int position) { int index=position%datas.size();//访问网络需要这个参数 ImageView view; if(convertView.size()>0){ view=convertView.remove(0); }else{ view= new ImageView(UiUtils.getContext()); } bitmapUtils.display(view, HttpHelper.URL + "image?name=" + datas.get(index)); container.addView(view); // 加载的view对象 return view; // 返回的对象 } }
第三种是用handler发延迟消息,和第二种差不多,第二种是延迟post(runnable),基于2,设置完最大数后可能一直滚动。然后用handler发消息,消息是一直让当前条目++,然后用延迟发消息,在外面也发,这个是第一次发。如果想停下来,定义个变量,在destory里再置为false就行。
/* * 自动循环: * 1、定时器:Timer * 2、开子线程 while true 循环 * 3、ColckManager * 4、 用handler 发送延时信息,实现循环 */ isRunning = true; // handler.sendEmptyMessageDelayed(0, 2000); } /** * 判断是否自动滚动 */ private boolean isRunning = false; private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { //让viewPager 滑动到下一页 viewPager.setCurrentItem(viewPager.getCurrentItem()+1); if(isRunning){ handler.sendEmptyMessageDelayed(0, 2000); } }; }; protected void onDestroy() { isRunning = false; }; private class MyPagerAdapter extends PagerAdapter { @Override /** * 获得页面的总数 */ public int getCount() { return Integer.MAX_VALUE; } @Override /** * 获得相应位置上的view * container view的容器,其实就是viewpager自身 * position 相应的位置 */ public Object instantiateItem(ViewGroup container, int position) { System.out.println("instantiateItem ::"+position); // 给 container 添加一个view container.addView(imageList.get(position%imageList.size())); //返回一个和该view相对的object return imageList.get(position%imageList.size()); } @Override /** * 判断 view和object的对应关系 */ public boolean isViewFromObject(View view, Object object) { if(view == object){ return true; }else{ return false; } } @Override /** * 销毁对应位置上的object */ public void destroyItem(ViewGroup container, int position, Object object) { System.out.println("destroyItem ::"+position); container.removeView((View) object); object = null; } }
当然,不要局限,三种方法可以混着用。
Android自动轮播的三种方式的更多相关文章
- android中解析文件的三种方式
android中解析文件的三种方式 好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...
- Android中关闭应用的三种方式
当应用不再使用的时候,通常需要关闭应用,我们可以使用三种方式关闭android应用: 第一种方式:首先获取当前进程的id,然后杀死该进程(推荐) android.os.Process.killProc ...
- Android 接入 OpenCV库的三种方式
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少 ...
- 界面跳转+Android Studio Button事件的三种方式
今天学习界面跳转 java类总是不能新建成功 看了网上教程 (20条消息) 关于android studio无法创建类或者接口问题的解决方法_qq_39916160的博客-CSDN博客 可以新建了 但 ...
- Android实现全屏的三种方式
一.通过代码 requestWindowFeature(Window.FEATURE_NO_TITLE);// 隐藏标题栏 getWindow().setFlags(WindowManager.Lay ...
- Android之——ContentResolver查询的三种方式
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47785491 今天做到一个小项目.查询手机中短信的信息,当然得去系统暴露出来的数据 ...
- 【Android学习】数据传递三种方式
1.Application 注意在清单文件中的Application节点下注册android:name属性, 继承Application类,重写onCreate方法, 使用数据时,实例化自定义类时需要 ...
- android解析XML总结(SAX、Pull、Dom三种方式) <转载>
android解析XML总结(SAX.Pull.Dom三种方式) http://www.cnblogs.com/JerryWang1991/archive/2012/02/24/2365507.htm ...
- Android中WebView的JavaScript代码和本地代码交互的三种方式
一.Android中WebView的漏洞分析最近在开发过程中遇到一个问题,就是WebView使用的时候,还是需要解决之前系统(4.2之前)导致的一个漏洞,虽然现在这个系统版本用户很少了,但是也不能忽视 ...
随机推荐
- 工作随笔——自动重发的凶手--feign
公司使用的feign(https://github.com/OpenFeign/feign)作为http客户端. 开发时debug后端程序,发现同一个请求会多次收到. 为了判断是谁在搞鬼,在客户端和服 ...
- 当前时间、前n天、后n天、取前n条记录、从第n条开始取m条
当前时间:NOW() 前n天:DATE_SUB(NOW(),INTERVAL n DAY) 后n天:DATE_SUB(NOW(),INTERVAL -n DAY) 取前n条记录:SELECT * FR ...
- 【CSS3】字体font
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 【python】字典dict
- 首次在C#程序中用log4net
众所周知log4net是一个很强大的日志管理库,我自己也用了下,这里作下记录: 首先新建一个项目Log4NetTest,然后将log4net.dll程序集添加引用至Log4NetTest. 然后在Lo ...
- 浅析 SpringMVC 原理和配置.
一.原理 Spring MVC基于模型-视图-控制器(Model-View-Controller,MVC)模式实现,它能够帮你构建像Spring框架那样灵活和松耦合的Web应用程序,将请求处理的逻辑和 ...
- bzoj 3653 [湖南集训]谈笑风生
题目描述 设 T 为一棵有根树,我们做如下的定义: • 设 a 和 b 为 T 中的两个不同节点.如果 a 是 b 的祖先,那么称"a 比 b 不知道高明到哪里去了". • 设 a ...
- Cat 客户端采用什么策略上报消息树
策略分类 目前搞清楚两种 第一种(蓝色):默认服务器列表中选一个,算法核心是根据应用名的哈希值取模.也就是说同一个应用始终打到同一台服务器上,如果这台服务器挂了,另选一台服务器. 第二种(红色):应用 ...
- IDEA 环境设置
IDEA环境设置 任何事物都有两面性,如何用好才是关键.IDEA为我们提供了丰富的功能,但不代表默认的配置就适合于你.我们应当根据自己的条件.需求合理的配置,从而驾驭好这匹悍马.让它成为我们编程的利器 ...
- python 嵌套字典比较值,取值
#取值import types allGuests = {'Alice': {'apples': 5, 'pretzels': {'12':{'beijing':456}}}, 'Bob': {'ha ...