安卓ViewPager无限循环

来源:互联网 发布:唯女子与小人难养 知乎 编辑:程序博客网 时间:2024/04/30 09:44

viewpager的无限循环原理就是当滚到最后一条时预加载下一条,这个下一条设置成第一条即可,实现无限循环。
这里写图片描述
简易图,第三张回到第一张的,向右滑动,显示的是第五个page,松手跳到第二个page

adapter:

package com.example.flowtest.BannerPager;import java.util.List;import android.os.Handler;import android.os.Message;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.view.View;import android.view.ViewGroup;public class BannerPagerAdapter extends PagerAdapter implements        OnPageChangeListener {    private List<BannerPagerItem> listViews;    private ViewPager myPager;    private boolean isLoop;    private BannerPagerAdapterCallback callback;    private boolean isTouch;    private int time;    private long timeNow;    public BannerPagerAdapter(List<BannerPagerItem> listViews,            List<BannerPagerBean> listBeans, ViewPager myPager, boolean isLoop,            int time, BannerPagerAdapterCallback callback) {        this.listViews = listViews;        this.myPager = myPager;        this.isLoop = isLoop;        this.callback = callback;        this.time = time;        if (isLoop) {            Message msg = new Message();            handler.sendMessageDelayed(msg, time);            timeNow = System.currentTimeMillis();        }    }    @Override    public int getCount() {        return listViews.size();    }    @Override    public boolean isViewFromObject(View arg0, Object arg1) {        return arg0 == (arg1);    }    @Override    public Object instantiateItem(View arg0, int position) {        BannerPagerItem view = listViews.get(position);        ViewGroup parent = (ViewGroup) view.getParent();        if (parent != null) {            parent.removeView(view);        }        ((ViewPager) arg0).addView(view);        return view;    }    @Override    public void destroyItem(ViewGroup container, int position, Object object) {        container.removeView(listViews.get(position));    }    @Override    public void onPageScrollStateChanged(int arg0) {    }    @Override    public void onPageScrolled(int arg0, float arg1, int arg2) {    }    @Override    public void onPageSelected(int position) {        if (listViews.size() > 1) {            if (position < 1) {                position = listViews.size() - 2;                myPager.setCurrentItem(position, false);            } else if (position > listViews.size() - 2) {                myPager.setCurrentItem(1, false);                position = 1;            }        }        if (isLoop) {            Message msg = new Message();            handler.sendMessageDelayed(msg, time);            timeNow = System.currentTimeMillis();        }        callback.onPageSelected(position);    }    public void setTouch(boolean isTouch) {        this.isTouch = isTouch;    }    private Handler handler = new Handler() {        public void handleMessage(Message msg) {            long t = System.currentTimeMillis() - timeNow;            if (t >= time) {                int index = myPager.getCurrentItem();                myPager.setCurrentItem(index + 1);            }        };    };    public interface BannerPagerAdapterCallback {        public void onPageSelected(int position);    }}

写了一个自定义控件

    /**     * 初始化控件, 必须实现的方法     *      * @param activity     *            获取activity     * @param listBeans     *            设置需要显示的数据     * @param isLoop     *            是否自动轮播     * @param time     *            自动轮播时间,(isLoop==false是无效)     * @param adapterCallBack     *            切换时调用(pager下面的原点)     * @param adapterCallBack     *            pager点击事件     * **/    public void initPager(Activity activity, List<BannerPagerBean> listBeans,            boolean isLoop, int time,            BannerPagerAdapterCallback adapterCallBack,            BannerPagerViewCallBack viewCallBack) {        this.activity = activity;        this.listBeans = listBeans;        this.callBack = viewCallBack;        this.isLoop = isLoop;        this.time = time;        this.adapterCallBack = adapterCallBack;        init();    }

demo在下面,可以直接使用

http://download.csdn.net/detail/b805887485/9593905

0 0
原创粉丝点击