文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android ViewPager实现无限循环效果

2022-06-06 08:54

关注

最近项目里有用到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, 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实现ViewPager无限循环效果(二)Android ViewPager无限循环滑动并可自动滚动完整实例Android ViewPager导航小圆点实现无限循环效果Android ViewPager实现无限循环的实例Android ViewPager实现无限循环轮播广告位Banner效果Android ViewPager实现智能无限循环滚动回绕效果Android实现基于ViewPager的无限循环自动播放带指示器的轮播图CarouselFigureView控件Android ViewPager无限循环实现底部小圆点动态滑动Android viewpager中动态添加view并实现伪无限循环的方法Android实现ViewPager无限循环效果(一)


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯