栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android ViewPager实现无限循环效果

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android ViewPager实现无限循环效果

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

先看看效果


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

实现思路

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

代码实现

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

public void initItemList(List mediaList){
      List newMediaList = new ArrayList();
      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 mMediaList = new ArrayList();

    private boolean isInfiniteLoop; //是否无限循环
    int size;

    public AdImagePagerAdapter (LayoutInflater inflater ,List mediaList){
      mInflater = inflater;
      isInfiniteLoop = false;
      initItemList(mediaList);
      size = mMediaList.size();
    }

    public void initItemList(List mediaList){
      List newMediaList = new ArrayList();
      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, holder.mImageView,adImageOptions,null,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);
 }else if(position > adImageAdapter.getCount()-2){
   position = 1;
   adViewPager.setCurrentItem(1, false);
 }
 setAdPagePointSelected(position-1);
      }
    }

  }

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/163062.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号