ViewPager实现无限循环的2种方法
2017-02-21 17:11
579 查看
项目中有一处banner循环滚动,近期发现在某机型上快速滑动会有一点点问题(还是配置很高级的机型)。于是换了一种实现方式。
以ViewPager中有3个Item为例。它的排列如下:
先第一种方式的思路,是在首尾各加一张图片。使其排列如下:
然后滑到首尾2张图片(外层的2和0)时给它悄悄回到对应的位置(内层的0和2)
处理如下:
第二种方式,是不设置ViewPager的边界,使其拥有超多个选项卡(Integer.MAX_VALUE),然后将初始位置设置在中间。
只需要修改PagerAdapter的getCount方法
因此还需要重写ViewPager的setCurrentItem方法。
以ViewPager中有3个Item为例。它的排列如下:
先第一种方式的思路,是在首尾各加一张图片。使其排列如下:
然后滑到首尾2张图片(外层的2和0)时给它悄悄回到对应的位置(内层的0和2)
处理如下:
mViewPager.setAdapter(viewPagerAdapter); mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if(viewPagerAdapter.getCount() <= 1) return; if(position == viewPagerAdapter.getCount()-1){ mViewPager.setCurrentItem(1, false); }else if(position == 0){ mViewPager.setCurrentItem(viewPagerAdapter.getCount()-2, false); } } @Override public void onPageScrollStateChanged(int state) { } });
第二种方式,是不设置ViewPager的边界,使其拥有超多个选项卡(Integer.MAX_VALUE),然后将初始位置设置在中间。
只需要修改PagerAdapter的getCount方法
@Override public int getCount() { if(pageItems.size()==1){ return 1; } return Integer.MAX_VALUE; }但在setCurrentItem()的时候,发现可能有发生ANR,发生ANR的地方是下面的else中。
if (mFirstLayout) { // We don't have any idea how big we are yet and shouldn't have any pages either. // Just set things up and let the pending layout handle things. mCurItem = item; if (dispatchSelected) { dispatchOnPageSelected(item); } requestLayout(); } else { populate(item); scrollToItem(item, smoothScroll, velocity, dispatchSelected); }原因是,ViewPager初始化完成后,再调setCurrentItem,ViewPager会一个一个页卡滑过去,直到滑到指定的页卡。
因此还需要重写ViewPager的setCurrentItem方法。
@Override public void setCurrentItem(int item) { if (Math.abs(item-getCurrentItem()) > 3){ setFirstLayout(); } super.setCurrentItem(item); } @Override public void setCurrentItem(int item, boolean smoothScroll) { if (Math.abs(item-getCurrentItem()) > 3){ setFirstLayout(); } super.setCurrentItem(item, smoothScroll); } private void setFirstLayout(){ try { Field mFirstLayout = ViewPager.class.getDeclaredField("mFirstLayout"); mFirstLayout.setAccessible(true); mFirstLayout.set(this, true); }catch(Exception e) { e.printStackTrace(); } }
相关文章推荐
- ViewPager系列之ViewPager无限循环滑动原理、代码、2种实现方法比较
- 用最简单的方法实现ViewPager无限循环滑动(跑马灯)效果
- Android viewpager中动态添加view并实现伪无限循环的方法
- Android Studio导入第三方包(资源)方法,ViewPager+TabLayout的使用,ViewPager单独使用实现无限循环
- Android中ViewPager无限循环实现方法
- Android ViewPager实现无限循环滑动
- Android ViewPager实现无限循环效果
- 无限循环的轮播图ViewPager实现
- 【Android】ViewPager实现无限循环滚动
- viewpager实现无限循环滚动幻灯片
- android viewpager实现无限循环自动滚动
- Android使用ViewPager实现无限循环滑动及轮播(附源码)
- ViewPager实现循环滑动实现方法+定时自动滑动实现方法详解
- android viewpager 实现左右无限循环
- Android ViewPager 实现无限循环滑动
- ViewPager实现无限循环切换和手势滑动效果
- android 自定义无限循环播放的viewPager。轮播ViewPager。实现循环播放 广告,主题内容,活动,新闻内容时。
- 使用ViewPager实现自动无限循环的轮播
- viewpager自动无限循环实现
- Android从菜鸟到笨鸟:ViewPager+Handler实现广告栏无限循环