Android ViewPager实现无限循环效果

Android ViewPager实现无限循环效果,第1张

概述最近项目里有用到ViewPager来做广告运营位展示,看到现在很多APP的广告运营位都是无限循环的,所以就研究了一下这个功能的实现。

最近项目里有用到VIEwPager来做广告运营位展示,看到现在很多APP的广告运营位都是无限循环的,所以就研究了一下这个功能的实现。

先看看效果


从一个方向上一直滑动,么有滑到尽头的感觉,具体是怎么实现的呢?看下面的思路。

实现思路

此处画了一幅图来表达实现无限循环的思路,即在数据起始位置前插入最后一项数据,在最后一项数据后插入第一项数据,当滑动到此处时,更新页面的索引位置就ok了 。

代码实现

这个方法用于数据处理,其中mediaList是原始数据,newMediaList是处理完的数据,mMediaList是用于页面显示的数据。

public voID initItemList(List<MediaIntro> mediaList){      List<MediaIntro> newMediaList = new ArrayList<MediaIntro>();      newMediaList.addAll(mediaList);      if(newMediaList.size() > 1){        //第0个位最后一个,向左拉动时,可以实现直接滑动到最后一个,最后一个是第0个,可以实现向右滑动的时直接跳到第0个        newMediaList.add(0,mediaList.get(mediaList.size() -1));        newMediaList.add(mediaList.get(0));      }      mMediaList = newMediaList;    }

完整的adapter的代码:

public class AdImagePagerAdapter extends RecyclingPagerAdapter{    private LayoutInflater mInflater;    private List<MediaIntro> mMediaList = new ArrayList<MediaIntro>();    private boolean isInfiniteLoop; //是否无限循环    int size;    public AdImagePagerAdapter (LayoutInflater inflater,List<MediaIntro> mediaList){      mInflater = inflater;      isInfiniteLoop = false;      initItemList(mediaList);      size = mMediaList.size();    }    public voID initItemList(List<MediaIntro> mediaList){      List<MediaIntro> newMediaList = new ArrayList<MediaIntro>();      newMediaList.addAll(mediaList);      if(newMediaList.size() > 1){        //第0个位最后一个,向左拉动时,可以实现直接滑动到最后一个,最后一个是第0个,可以实现向右滑动的时直接跳到第0个        newMediaList.add(0,mediaList.get(mediaList.size() -1));        newMediaList.add(mediaList.get(0));      }      mMediaList = newMediaList;    }    public MediaIntro getItem(int position){      return mMediaList.get(position);    }    public int getposition(int position){      return isInfiniteLoop? position%size:position;    }    @OverrIDe    public VIEw getVIEw(int position,VIEw convertVIEw,VIEwGroup parent) {      // Todo auto-generated method stub      final VIEwHolder holder;      final MediaIntro media = getItem(position);      if(convertVIEw == null){        holder = new VIEwHolder();        convertVIEw = mInflater.inflate(R.layout.home_ad_item,parent,false);        holder.mImageVIEw = (ImageVIEw)convertVIEw.findVIEwByID(R.ID.homeAdItemimg);        holder.mTextVIEw = (TextVIEw)convertVIEw.findVIEwByID(R.ID.homeAdItemTxt);        convertVIEw.setTag(holder);      }else{        holder=(VIEwHolder)convertVIEw.getTag();      }      if(media.source.equals(MagicSource.soURCE_OUT_AD)){        imageLoader.displayImage(adImageUrl,holder.mImageVIEw,adImageOptions,null,null);        holder.mTextVIEw.setText("");        holder.mImageVIEw.setonClickListener(new OnClickListener() {          @OverrIDe          public voID onClick(VIEw v) {            // Todo auto-generated method stub            //广告点击事件          }        });      }else {        imageLoader.displayImage(media.imgurl,null);        holder.mTextVIEw.setText(media.desc+"");        holder.mImageVIEw.setonClickListener(new OnClickListener() {          @OverrIDe          public voID onClick(VIEw v) {            // Todo auto-generated method stub            startMediaDetail(media);          }        });      }      return convertVIEw;    }    @OverrIDe    public int getCount() {      // Todo auto-generated method stub      return isInfiniteLoop ? Integer.MAX_VALUE : mMediaList.size();    }    private class VIEwHolder{      ImageVIEw mImageVIEw = null;      TextVIEw mTextVIEw = null;    }    public boolean isInfiniteLoop(){      return isInfiniteLoop;    }    public AdImagePagerAdapter setInfiniteLoop(boolean isInfiniteLoop){      this.isInfiniteLoop =isInfiniteLoop;      return this;    }  }

更新页面索引的代码:

@OverrIDe    public voID onPageSelected(int position) {      // Todo auto-generated method stub      if(adImageAdapter.getCount()>1){         if(position<1){          position=adImageAdapter.getCount()-2;          adVIEwPager.setCurrentItem(adImageAdapter.getCount()-2,false);        }else if(position > adImageAdapter.getCount()-2){          position = 1;          adVIEwPager.setCurrentItem(1,false);        }        setAdPagePointSelected(position-1);      }    }

完整的滑动监听器代码

public class OnAdPagechangelistener implements OnPagechangelistener{    @OverrIDe    public voID onPageScrollStateChanged(int arg0) {      // Todo auto-generated method stub    }    @OverrIDe    public voID onPageScrolled(int arg0,float arg1,int arg2) {      // Todo auto-generated method stub    }    @OverrIDe    public voID onPageSelected(int position) {      // Todo auto-generated method stub      if(adImageAdapter.getCount()>1){         if(position<1){          position=adImageAdapter.getCount()-2;          adVIEwPager.setCurrentItem(adImageAdapter.getCount()-2,false);        }        setAdPagePointSelected(position-1);      }    }  }

以上就是本文的全部内容,希望对大家学习AndroID软件编程有所帮助。

总结

以上是内存溢出为你收集整理的Android ViewPager实现无限循环效果全部内容,希望文章能够帮你解决Android ViewPager实现无限循环效果所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1141810.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存