Viewpager循环滑动的实现

导语 本文讲述实现ViewPager循环滑动效果的两种方案:

方案1:

复写ViewPager或者Adapter,扩展dataList,左右各加1。

核心思路就是将数据集的左右两侧加一条数据,分别是原来数据集的最后一条和第一条,在用户滑动到边界页面时自动跳转页面。

比如本来的页面有5页,对应5条数据,如下图:

经过扩展后,数据集元素数量+2,变成

这个时候postion为1的数据成为实际上的第一个页面。展示的内容为a。

在postion为1的时候左滑,会跳转到展示内容为e的页面,当然这次跳转过程对用户是无感知的。

例:

if(curPos == 0){

      setCurrentItem(5, false) ;// false表示无动画

}

要做的工作:

•1.扩展list,getCount()==list.size()+2;

•2.当index为0时,自动设置index为list.size().

•3.当index为list.size()+1时,自动设置index为1.

•4.防止setCurrentItem时发生页面跳变,需要维护第一个页面和最后一个页面内容的缓存。即a 和 e的缓存.

•5.考虑刚好有2个数据的情况,重写getItemPostion方法:

因为b元素在viewPager的位置有两个,0和2,同理a也是。

当前页面为b页时,左右两页都是a,返回的postion都是1,在viewPager的排序过程中会把两个a页面都移动到b的左边,导致滑动异常。

例:在位置1上的view a,和位置3上的view a 都返回同一个position 1.

notifyDatasetChange之前:

notifyDatasetChange中排序后:

关键在于list的数量是否一定大于2.

方案2:

使viewPager得到的size非常长,长到一般用户无法触及边界,再用循环的数据集填满它,取中间的位置作为用户看到的起始页面。

zzZ 就是这么任性。。

要做的工作:

•复写Adapter的getCount方法,返回一个较大的值,如data.size()*100。

•复写instantiateItem()方法,用postion%dataSize的方式为viewPager返回一个正确位置上的view。

•初始化后执行mViewPager.setCurrentItem(data.size()*50);

例:

@Override

public int getCount() {

      return mDatas.size() * 100; // 总量的100倍

}

public int getActualPosition(int pagerPosition) {

            final int size = mDatas.size();

            return pagerPosition % size;

}

•性能上的考虑:

这种方法要求在第一次加载的时候执行setCurrentItem();

调用此方法,ViewPager中会依次执行addNewItem,最后走到Adapter的instantiateItem方法。

setCurrentItem(101); 会走100+次instantiateItem();

实现上,为了保证instantiateItem方法的效率,缓存是必须的,绝对不能每次instantiateItem的时候都重新inflate一个view。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏QQ会员技术团队的专栏

深入理解React(二) :数据流和事件原理

在React中,数据流是自上而下单向的从父节点传递到子节点,所以组件是简单且容易把握的,他们只需要从父节点提供的props中获取数据并渲染即可。如果顶层组件的某...

4.8K00
来自专栏腾讯移动品质中心TMQ的专栏

iOS 测试利器:idb

对于android的开发以及测试人员,对adb命令一定会很熟悉,adb工具可谓android测试的入门神器,安装、卸载、抓log、截图等等一应俱全。很多自动化以...

3.2K10
来自专栏Matthew

5分钟教你打造一个秒开的 Android App

近日在开发过程中,发现每次点击 app 从桌面启动都有一个在桌面明显的等待时间,机型越低端的越明显,冷启动优化看来已经势在必行,所以怒而一顿研究再解决之。

1.9K10
来自专栏QQ空间开发团队的专栏

RxJava && Agera 从源码简要分析基本调用流程(1)

相信很多做Android或是Java研发的同学对RxJava应该都早有耳闻了,尤其是在Android开发的圈子里,RxJava渐渐开始广为流行。同样有很多同学已...

8.6K10
来自专栏QQ空间开发团队的专栏

RxJava && Agera 从源码简要分析基本调用流程(2)

RxJava能够帮助我们对数据流进行灵活的变换,以达到链式结构操作的目的,然而它的强大不止于此。下面我们就来看看它的又一利器,调度器`Scheduler`:就像...

9.3K10
来自专栏刘宁的专栏

Android开发入门的正确姿势

对于从事移动客户端开发者的初学者而言,不论是Android还是iOS开发,对客户端开发有一个整体的认识,然后再逐步深入,这样会有事半功倍的效果。

1.4K00
来自专栏应兆康的专栏

遇见 Kotlin 先导篇:Kotlin 相比 Java 好在哪里?

Kotlin 是一种为现代多平台应用而诞生的静态编程语言相比于Java而言,它有很多优点,待会笔者会就几个写一下,并给出实际例子。

50440
来自专栏Bennyhuo

用 Kotlin 写 Android ,难道只有环境搭建这么简单?

话说我们入坑 Kotlin 之后,要怎样才能把它运用到 Android 开发当中呢?我们作为有经验的开发人员,大家都知道 Android 现在基本上都用 gra...

5.8K00
来自专栏腾讯移动品质中心TMQ的专栏

一种 Android 端 Web 多进程情况下支持 Web 自动化测试的方法

本文介绍一种在Web多进程情况下支持Web自动化测试的方案。介绍当前Web自动化的简要原理、Web多进程后的问题、相应的解决方案及使用方法。

40700
来自专栏腾讯IVWEB团队的专栏

使用 Xposed 强制 androidwebView 开启 debug 模式

从 《远程调试 Android 设备使用入门》文章中我们可以知道在 android 4.4+可以通过在apk中使用下面的代码开启 webview 的 chrom...

70200

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励