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之前)导致的一个漏洞,虽然现在这个系统版本用户很少了,但是也不能忽视 ...
随机推荐
- springCloud项目练习
1.https://gitee.com/xfdm/FCat angular4.springcloud开源实战项目:FCat项目(springcloud.mybatis.redis.angular4)是 ...
- java.net.BindException: Cannot assign requested address: bind
异常信息 时间:2017-03-16 10:21:05,644 - 级别:[ERROR] - 消息: [other] Failed to start end point associated with ...
- Net Core中数据库事务隔离详解——以Dapper和Mysql为例
Net Core中数据库事务隔离详解--以Dapper和Mysql为例 事务隔离级别 准备工作 Read uncommitted 读未提交 Read committed 读取提交内容 Repeatab ...
- sqlserver 存储过程 带输出参数
CREATE PROCEDURE [dbo].[output] @acctNbr varchar(), --会员卡号 @acctPwd1 nvarchar() OUT, --登录密码 @acctPwd ...
- iOS UICollectionView(转三)
上篇博客的实例是自带的UICollectionViewDelegateFlowLayout布局基础上来做的Demo, 详情请看<iOS开发之窥探UICollectionViewControlle ...
- mvc中signalr实现一对一的聊天
Asp.net MVC中实现即时通讯聊天的功能.前几天刚写了一片基础入门的教程,今天就来实现一下使用signaIr实现一对一的聊天的功能,对于这种场景也是即时通讯最基本功能.好吧废话不多说.先来看一下 ...
- C#序列化总结
贴一下自己序列化的代码: public class XMLUtil { /// <summary> /// XML & Datacontract Serialize & D ...
- 【算法设计与分析基础】24、kruskal算法详解
首先我们获取这个图 根据这个图我们可以得到对应的二维矩阵图数据 根据kruskal算法的思想,首先提取所有的边,然后把所有的边进行排序 思路就是把这些边按照从小到大的顺序组装,至于如何组装 这里用到并 ...
- 妙味课堂:JavaScript初级--第11课:字符串、查找高亮显示
1.数字字母 Unicode 编码 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content- ...
- C# 将DataTable一行放入另一个DataTable中
http://blog.csdn.net/huyu107/article/details/53509171 概述 从一个DataTable中取一行放到另一个DataTable里报错: 该行已经属于另一 ...