我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android ViewPager实现无限循环效果

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android ViewPager实现无限循环效果

最近项目里有用到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

Android ViewPager实现无限循环效果

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android ViewPager实现无限循环效果

最近项目里有用到ViewPager来做广告运营位展示,看到现在很多APP的广告运营位都是无限循环的,所以就研究了一下这个功能的实现。 先看看效果从一个方向上一直滑动,么有滑到尽头的感觉,具体是怎么实现的呢?看下面的思路。 实现思路此处画了一
2022-06-06

Android ViewPager导航小圆点实现无限循环效果

之前用View Pager做了一个图片切换的推荐栏(就类似与淘宝、头条客户端顶端的推荐信息栏),利用View Pager很快就能实现,但是一次无意间使用淘宝APP的时候,突然发现它的效果和我做的还不一样,淘宝APP的推荐栏可以左右无限循环切
2023-05-30

Android ViewPager怎么去实现无限循环滚动回绕效果

不懂Android ViewPager怎么去实现无限循环滚动回绕效果?其实想解决这个问题也不难,下面让小编带着大家一起学习怎么去解决,希望大家阅读完这篇文章后大所收获。android系统提供的ViewPager标准方式是左右可以自由滑动,但
2023-05-30

Android ViewPager如何实现无限循环轮播广告位Banner效果

这篇文章将为大家详细讲解有关Android ViewPager如何实现无限循环轮播广告位Banner效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。现在一些app通常会在头部放一个广告位,底部放置一行小
2023-05-30

Android实现轮播图无限循环效果

本文实例为大家分享了Android轮播图无限循环的具体代码,供大家参考,具体内容如下 实现无限循环 在getCount()方法中,返回一个很大的值,Integer.MAX_VALUE 在instantiateItem()方法中,获取当前Vi
2022-06-06

Android中怎么利用ViewPager实现无限循环

本篇文章为大家展示了Android中怎么利用ViewPager实现无限循环,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android ViewPager实现无限循环的实例ViewPager自身并不
2023-05-31

Android使用ViewPager实现无限滑动效果

前言 其实仔细想一下原理还是挺简单的。无非是当我们滑动到最后一页,再向后滑动时定位到第一页;当我们滑动到第一页,再向前滑动时定位到最后一页。 但是,相信很多朋友都遇到过这个问题:视图的过度效果不自然。 小编也是通过百度和谷歌查找了很多解决方
2022-06-06

RecyclerView无限循环效果怎么实现

这篇文章主要介绍“RecyclerView无限循环效果怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“RecyclerView无限循环效果怎么实现”文章能帮助大家解决问题。1、修改adpter
2023-07-05

Android 使用viewpager实现无限循环(定时+手动)

循环轮播的方法有两种,一种是使用定时器另外一种是使用手指拨动,相比较而言,定时器实现循环播放比较容易,只要在定时器的消息里加上简单几段代码即可,下面分别就这两种方法给大家详解,具体详情请看下文吧。int count = adapter.ge
2022-06-06

怎么实现Android TV 3D卡片无限循环效果

这篇文章主要讲解了“怎么实现Android TV 3D卡片无限循环效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现Android TV 3D卡片无限循环效果”吧!##思路自定义Vi
2023-06-25

Unity ScrollView如何实现无限循环效果

小编给大家分享一下Unity ScrollView如何实现无限循环效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下在Unity引擎中ScrollVi
2023-06-20

Android ViewPager无限循环实现底部小圆点动态滑动

页面拖动到最后一页 再向下滑动回复到 第一页,第一页向前滑动回到 最后一页 同时,底部红色小圆点随着页面的滑动距离比例随时改变位置布局:
2022-06-06

Android 使用ViewPager实现左右循环滑动及轮播效果

ViewPager是一个常用的Android组件,不过通常我们使用ViewPager的时候不能实现左右无限循环滑动,在滑到边界的时候会看到一个不能翻页的动画,可能影响用户体验。此外,某些区域性的ViewPager(例如展示广告或者公告之类的
2022-06-06

Android实现带指示点的自动轮播无限循环效果

想要实现无限轮播,一直向左滑动,当到最后一个view时,会滑动到第一个,无限… 可以自己写ViewPager然后加handler先实现自动滚动,当然这里我为了项目的进度直接使用了Trinea的Android-auto-scroll-view
2022-06-06

CSS3如何实现无限循环的滚动效果

这篇文章主要讲解了“CSS3如何实现无限循环的滚动效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS3如何实现无限循环的滚动效果”吧!1. 使用CSS3来实现若要用CSS3的属性实现的
2023-07-04

CSS3怎么实现无限循环的无缝滚动效果

这篇文章主要讲解了“CSS3怎么实现无限循环的无缝滚动效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS3怎么实现无限循环的无缝滚动效果”吧!1. 使用CSS3来实现若要用CSS3的属
2023-07-05

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录