android 实现无限循环viewpager

来源:互联网 发布:iphone手机称重软件 编辑:程序博客网 时间:2024/04/25 06:30

原理:

(1)在原有的adapter里添加一头一尾,当滑动到尾部的时候,通过setCurrentItem(1,false)切换到第二项,同理,滑动到第0项则切换到最后一项


(2)使用timer进行自动跳转


代码:

/***记录当前viewpager处于那一页*/private int mNowPage;/***储存Fragment的list*/private List<fragment> mLs = new ArrayList<fragment>();// 无限循环viewpagermVp = (ViewPager) getView().findViewById(R.id.vp);mVapater = new VPAdapterT(getFragmentManager());//配置viewpagermVp.setAdapter(mVapater);mVp.setOnPageChangeListener(new OnPageChangeListener() {@Overridepublic void onPageSelected(int arg0) {          //selected这个方法,是在滑动时,手指弹起的那一刻                         //setCurrentItem(1,false)方法不能在这里执行                                 //否则在首位切换时手指弹起就直接跳转                                 //这里主要处理小圆点的切换,代码不作补充                                mNowPage = arg0;                       if (mNowPage != 0&& mNowPage != mLs.size() - 1) {mLs_Dots.get(mNowDots).setEnabled(false);mNowDots = mNowPage - 1;mLs_Dots.get(mNowDots).setEnabled(true);}else if(mNowPage==0){       mLs_Dots.get(mNowDots).setEnabled(false);mNowDots=mLs_Advertisement_.size() - 3;mLs_Dots.get(mNowDots).setEnabled(true);}else if (mNowPage== mLs.size() - 1) {mLs_Dots.get(mNowDots).setEnabled(false);mNowDots=0;mLs_Dots.get(mNowDots).setEnabled(true);}}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageScrollStateChanged(int arg0) {                                //PageScrollStateChanged有不同的状态,arg0为0时代表动画结束,1为触屏                                //所以首尾交换只能放在这里进行,就察觉不到其实已经切换了页面if (arg0 == 0) {if (mNowPage == mLs.size() - 1) {mVp.setCurrentItem(1, false);}if (mNowPage == 0) {mVp.setCurrentItem(mLs.size() - 2,false);}MainActivity.this.time();   //如果页面切换完毕,则执行下一次计时}if (arg0==1) {timer.cancel();    //如果手指触摸这个viewpager,先停止计时器}}});</fragment></fragment>

计时器:

         private Timer timer ;private void time() {timer = new Timer();TimerTask task = new TimerTask() {public void run() {Message message = new Message();message.what = 1;handler.sendMessage(message);}};timer.schedule(task, 5000);}        private Handler handler = new Handler() {@SuppressLint("HandlerLeak")public void handleMessage(Message msg) {switch (msg.what) {case 1:timer.cancel();mVp.setCurrentItem(mNowPage + 1);break;}super.handleMessage(msg);}};


0 0