Viewpager 自动轮播(无限循环) ,手动滑动时停止轮播+底部小圆点(一)

两三个月前做了一个listview头部添加viewpager的一个App,虽然已经上线,但是效果不是很好,不能无限轮播。这一段不是很忙,特意整理了一下,供大家参考互相学习。之前做项目的时候,上网看了好多自定轮播无限循环的,但嵌入项目中时总会多多少少出现问题,那时时间紧,没仔细研究。现在梳理一下:

想让无限轮播,网上大多有两种解决方案:

一种是在第一张前边加上一张最后的图片,在最后一种加上第一张图片,如果是3张,加上就变成了5张。这样真正的实现无限循环。

一种是设置无限大,假设初始位设置在中间,这样也可以无限划,当然不是真正的无限,不过也没有人会往一个方向使劲划,毕竟Integer.MAX_VALUE很大

这个例子是在参考一个Viewpager轮播的基础上修改的,原版没有小圆点,不能获取网络图片。网址我给忘了,看我的就行了,升级版。

我发现很多例子都是从本地图片获取的,没有网络异步加载的,让我这菜鸟用起来不是很爽,还得改一下,还好,我写的是网络接口获取图片,大家应该很喜欢

Viewpager 自动轮播(无限循环) ,手动滑动时停止轮播+底部小圆点(一)_第1张图片

好了,废话不说,直接上代码:

首先你得知道Volley是什么,怎么用,不知道可以看我这篇文章:http://blog.csdn.net/shr957250701/article/details/41210071

我们需要一个ImageHandler类来管理图片的状态:

package com.example.android_atuoviewpager;

import java.lang.ref.WeakReference;

import android.os.Handler;
import android.os.Message;

public class ImageHandler extends Handler{  
    
    /** 
     * 请求更新显示的View。 
     */  
    protected static final int MSG_UPDATE_IMAGE  = 1;  
    /** 
     * 请求暂停轮播。 
     */  
    protected static final int MSG_KEEP_SILENT   = 2;  
    /** 
     * 请求恢复轮播。 
     */  
    protected static final int MSG_BREAK_SILENT  = 3;  
    /** 
     * 记录最新的页号,当用户手动滑动时需要记录新页号,否则会使轮播的页面出错。 
     * 例如当前如果在第一页,本来准备播放的是第二页,而这时候用户滑动到了末页, 
     * 则应该播放的是第一页,如果继续按照原来的第二页播放,则逻辑上有问题。 
     */  
    protected static final int MSG_PAGE_CHANGED  = 4;  
       
    //轮播间隔时间  
    protected static final long MSG_DELAY = 8000;  
       
    //使用弱引用避免Handler泄露.这里的泛型参数可以不是Activity,也可以是Fragment等  
    private WeakReference weakReference;  
    private int currentItem = 0;  
       
    protected ImageHandler(WeakReference wk){  
        weakReference = wk;  
    }  
       
    @Override  
    public void handleMessage(Message msg) {  
        super.handleMessage(msg);  
//        Log.d(LOG_TAG, "receive message " + msg.what);  
        MainActivity activity = weakReference.get();  
        if (activity==null){  
            //Activity已经回收,无需再处理UI了  
            return ;  
        }  
        //检查消息队列并移除未发送的消息,这主要是避免在复杂环境下消息出现重复等问题。  
        if (activity.handler.hasMessages(MSG_UPDATE_IMAGE)){  
            activity.handler.removeMessages(MSG_UPDATE_IMAGE);  
        }  
        switch (msg.what) {  
        case MSG_UPDATE_IMAGE:  
            currentItem++;  
            activity.viewPager.setCurrentItem(currentItem);  
            //准备下次播放  
            activity.handler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE, MSG_DELAY);  
            break;  
        case MSG_KEEP_SILENT:  
            //只要不发送消息就暂停了  
            break;  
        case MSG_BREAK_SILENT:  
            activity.handler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE, MSG_DELAY);  
            break;  
        case MSG_PAGE_CHANGED:  
            //记录当前的页号,避免播放的时候页面显示不正确。  
            currentItem = msg.arg1;  
            break;  
        default:  
            break;  
        }   
    }  
}


我们还需要把数据绑定到ImageAdapter来和viewpager关联起来:

public class ImageAdapter extends PagerAdapter {

	    private ArrayList viewlist ;  
		   
	    public ImageAdapter(ArrayList viewlist) {  
	        this.viewlist = viewlist;  
	    }  

	    @Override  
	    public int getCount() {  
	        //设置成最大,使用户看不到边界  
	        return Integer.MAX_VALUE;  
	    }  

	    @Override  
	    public boolean isViewFromObject(View arg0, Object arg1) {  
	        return arg0==arg1;  
	    }  
	     @Override    
	     public void destroyItem(ViewGroup container, int position,    
	             Object object) {    
	         //Warning:不要在这里调用removeView  
	     }    
	     @Override    
	     public Object instantiateItem(ViewGroup container, int position) {  
	         //对ViewPager页号求模取出View列表中要显示的项  
	         position %= viewlist.size();  
	         if (position<0){  
	             position = viewlist.size()+position;  
	         }  
	         ImageView view = viewlist.get(position);  
	         //如果View已经在之前添加到了一个父组件,则必须先remove,否则会抛出IllegalStateException。  
	         ViewParent vp =view.getParent();  
	         if (vp!=null){  
	             ViewGroup parent = (ViewGroup)vp;  
	             parent.removeView(view);  
	         }  
	         container.addView(view);    
	         //add listeners here if necessary  
	         return view;    
	     } 
	}

下一节我们接送负责解析Json的工具类,以及实现整个功能。



你可能感兴趣的:(Android)