最近项目里有用到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实现无限循环效果所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)