本文配套视频

  • ViewPager.setCurrentItem的bug演示一
  • ViewPager.setCurrentItem解决方案二

今天做项目用ViewPager.setCurrentItem 方法,如果两个页面相聚比较远,就会闪瞎我的钛合金双眼,中间切换大概20个页面,如下所示: 

setCurrentItem第二个参数设置false,四不四很简单,直接使用如下代码:

ViewPager.setCurrentItem(position,false);
  • 1

很不幸的是,使用上面的代码会出现如下效果,扎心了老铁: 

从第一题点击切换到第十八题,你会发现页面显示空白,如果从第十个页面切换到第十五个页面没事,平时大家估计没有发现这个bug,一般我们使用ViewPager都是底下5个tab页面,从第一个切换到第五个没事,之前我也以为把第二个参数设置false就行,今天才发现,原来如果当页面比较少的时候,大概十个以内,一般没有问题,如果超过十个页面切换就会出现空白,加载不了数据,扎心了,提出解决方案吧,ViewPager滑动使用的是Scroll,咱们把Scroll的滑动时间duration 设置为0就行。

自定义一个Scroll类,用于控制ViewPager滑动速度:

public  class MScroller extends Scroller {private static final Interpolator sInterpolator = new Interpolator() {public float getInterpolation(float t) {t -= 1.0f;return t * t * t * t * t + 1.0f;}};public boolean noDuration;public void setNoDuration(boolean noDuration) {this.noDuration = noDuration;}public MScroller(Context context) {this(context,sInterpolator);}public MScroller(Context context, Interpolator interpolator) {super(context, interpolator);}@Overridepublic void startScroll(int startX, int startY, int dx, int dy, int duration) {if(noDuration)//界面滑动不需要时间间隔super.startScroll(startX, startY, dx, dy, 0);elsesuper.startScroll(startX, startY, dx, dy,duration);}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

上面代码可知:

1)动态判断页面是否需要滑动,如果不需要滑动,设置滑动时间为0;

为方便使用,定义一个辅助类

public class ViewPageHelper {ViewPager viewPager;MScroller scroller;public ViewPageHelper(ViewPager viewPager) {this.viewPager = viewPager;init();}public void setCurrentItem(int item){setCurrentItem(item,true);}public MScroller getScroller() {return scroller;}public void setCurrentItem(int item, boolean somoth){int current=viewPager.getCurrentItem();//如果页面相隔大于1,就设置页面切换的动画的时间为0if(Math.abs(current-item)>1){scroller.setNoDuration(true);viewPager.setCurrentItem(item,somoth);scroller.setNoDuration(false);}else{scroller.setNoDuration(false);viewPager.setCurrentItem(item,somoth);}}private void init(){scroller=new MScroller(viewPager.getContext());Class<ViewPager>cl=ViewPager.class;try {Field field=cl.getDeclaredField("mScroller");field.setAccessible(true);//利用反射设置mScroller域为自己定义的MScrollerfield.set(viewPager,scroller);} catch (NoSuchFieldException e) {e.printStackTrace();}catch (IllegalAccessException e){e.printStackTrace();}}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

由上面代码可知:

1)Math.abs(current-item)>1 ,通过数学函数判断页面相隔大于1,就设置页面切换的动画的时间为0。

2)这样每次设置页面的时候,通过 helper 就可以自动选择是否有时间间隔了。

3)但是这样有点麻烦,每次还要手动改,而且使用TabLayout或者ViewPagerIndicator的话,它会自动调用ViewPager的方法,无法使用Helper,所以可以采用自定一个ViewPager,代码如下:

public class SuperViewPager extends ViewPager {private ViewPageHelper helper;public SuperViewPager(Context context) {this(context,null);}public SuperViewPager(Context context, AttributeSet attrs) {super(context, attrs);helper=new ViewPageHelper(this);}@Overridepublic void setCurrentItem(int item) {setCurrentItem(item,true);}@Overridepublic void setCurrentItem(int item, boolean smoothScroll) {MScroller scroller=helper.getScroller();if(Math.abs(getCurrentItem()-item)>1){scroller.setNoDuration(true);super.setCurrentItem(item, smoothScroll);scroller.setNoDuration(false);}else{scroller.setNoDuration(false);super.setCurrentItem(item, smoothScroll);}}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

至此完美解决了,ViewPager.setCurrentItem切换页面,效果如下: 

解决ViewPager.setCurrentItem中间很多页面切换方案相关推荐

  1. Android 解决ViewPager.setCurrentItem中间很多页面切换问题

    最近项目有个需求是主页包含4个Fragment,但还要求有滑动效果.相信大家第一个就会想到viewPager+fragment进行实现该功能了. 在做完功能后,发现有个问题,就是当我点击底部tab时, ...

  2. 解决viewpager setCurrentItem 白屏问题

    比如你刚刚初始化viewpager数据,每个viewpager里面放的fragment,   设置currentItem  为4  可能就会白屏. 解决方案 viewPager.setOffscree ...

  3. Android 底部导航栏+页面切换

    lzyprime 博客 (github) 更新时间: 2020.12.21 创建时间:2020.11.25 qq及邮箱:2383518170 kotlin & android 笔记 更新 20 ...

  4. ViewPager (下)-- 利用 Fragment 实现美丽的 页面切换

    之前用的ViewPager适用于简单的广告切换,但实现页面间的切换最好是用官方推荐的Fragment来处理. 本人力争做到最简单.最有用,是想以后用到的时候能够方便的拿过来复制就能够了. 效果图:   ...

  5. ViewPager页面切换效果

    ViewPager页面切换效果 运行效果一:                                                                               ...

  6. (仿头条APP项目)3.二级页面首页的ViewPager页面切换

    文章目录 二级页面首页的ViewPager页面切换 效果展示 代码实现 创建几个三级页面Fragment视图 ViewPager的Fragment数据丢失问题 创建fragment_home视图文件 ...

  7. ViewPager实现页面切换

    先贴效果图(每个开关Tab债券.尾随页变化.效果图蓝条添加的用户体验) 首先看总体效果图的布局文件吧(非常easy,就三部分,各自是Tab栏目.定位蓝条.各个页面(是V4包下的ViewPager)) ...

  8. html控制两个页面转换,html页面切换过度效果实现方案_蓝戒的博客

    html页面切换过度效果实现方法很简单,但是对于浏览器的设置有需求,经过测试IE浏览器的默认设置没有问题,但是其他浏览器需要进行设置才可以. 实现方法就是:利用文本头的 标记实现页面过渡效果,具体说明 ...

  9. AngularJs应用页面切换优化方案

    前言 AngularJs被用来开发单页面应用程序(SPA),利用AJAX调用配合页面的局部刷新,可以减少页面跳转,从而获得更好的用户体验.Angular的ngView及其对应的强大路由机制,是实现SP ...

最新文章

  1. samtools常用命令详解
  2. 2013/8月读书计划
  3. Windows平台Eclipse配置Maven
  4. 详解Vue八大生命周期钩子函数
  5. 【笔记目录】南邮(通达)计算机专业基础
  6. VB后台获得按键,并执行自己的函数(非钩子及热键)
  7. jq ajax购物车,jquery制作的移动端购物车效果完整示例
  8. 领域驱动设计学习笔记2
  9. nvidia-smi介绍
  10. 华为freelance耳机充不进电修理
  11. 用c语言实现BF算法
  12. 《蛋仔派对》通关小技巧
  13. red hat linux 9.0下载地址集合,Red Hat Linux 9.0 iso最新下载地址
  14. 王道数据结构课代表 - 考研数据结构 第三章 栈和队列 究极精华总结笔记
  15. 从零开始发送数字签名邮件-outlook163邮箱windows
  16. HTML小白起步(一、闲聊篇)
  17. ZigBee网络拓扑结构
  18. 学Python太枯燥?不多BB这几个有趣的python 库让你爱上python
  19. django 调用数据库图片的路径并在html显示
  20. Verilog——补码转换

热门文章

  1. 传智播客python培训班 青岛
  2. KodExplorer 4.40 发布,权限机制优化
  3. 【JavaSE】反射与注解
  4. 通过时间戳计算天数结果为负值
  5. 功能最全的上海盐谷小程序商城源码
  6. 简单的页面《静夜思》
  7. 统计学真的有那么可怕吗?这儿有可以手算的效能分析
  8. 个人永久性免费-Excel催化剂功能第67波-父子结构表转换添加辅助信息之子父关系篇...
  9. 【Vue+Mapbox】Vue中mapbox地图的使用(二)—— 自定义Geojson地图数据
  10. poi根据模版生成word(包括导出)