Android ViewPger实现真正的循环滑动
由于项目中要用到循环滑动的viewpager,在网上搜索后发现有两种实现方式
1、假的循环
通过设置
- @Override
- public int getCount() {
- return Integer.MAX_VALUE;
- }
其实这种循环滑动式有边界的,向左滑动一百次就不能继续循环了。按理说这种实现没有任何问题,不会有哪个无聊的人向左滑动那么多。但我用此方法实现了之后遇到了一个问题。就是在那个页面刷新时,viewpager.setCurrentItem(100).会在某种情况下出现卡死,需要过几分钟才能有反应,但这就会出现ARN。
不过对于对viewpager没有刷新,使用频率不高的情况下这种方法是很便捷的。
2、在view集合中第一个位置和最后一个位置分别添加最后一个数据要表现的界面和第一个数据要表现的界面
4 0 1 2 3 4 0 图:1-1
这种实现方式能真正实现viewpager的循环滑动,但在最后一页向第一页过渡时会出现很不自然的现象。
正文开始
我的方法是先第二种的基础上加以修改,既能实现viewpager的真正的循环滑动也能使其过渡自然。
上源码:
1、首先要想使viewpager可以在第一页时还能向左滑动,在最后一页时还能向右滑动,需要修改下面的代码:
![]()
这个函数是PagerAdpter中的一个返回viewpger子view数目的方法。recommendedList是存放数据的。通过将返回值加2能实现viewpager左右两侧都有一个view。
2、这是很重要的一点
虽然viewpager中有7个子view,但我只有5个数据,因此我需要将第一个元素显示最后一个数据,最后一个数据显示第一元素,其余位置的元素显示位置数减一的数据对应的元素。因此在PagerAdpter的
public Object instantiateItem(ViewGroup container, int position)方法中要将position进行转换。
如果position=0,则显示数据中的最后一个元素。如果position=recommList.size()+1(如果recommList.size()=5,则position=6,即position是最后一个元素),则显示第一个元素。其余情况下就显示前一个元素。
现在已经基本上完成了一半的工作,剩下一个就是处理第一个元素向左滑动和最后一个向右滑动时的情况。注:由于7个元素在viewpager中只显示5个,这里所说的第一个元素是指图:1-1中的第一个0,最后一个元素是指图:1-1中最后一个4.
3、处理边界滑动
在OnPageChangeListener类有一个记录veiwpager滑动状态的函数
如果当前页面是第一个0,则向左滑动进入第一个4页面,但我通过判断后将viewpager.setCurrentItem(recommendedList.size(),false);
此时viewpager就显示第二个4页面,注意要将上句代码中的false设置上,这样第一个4界面与第二个4界面的过渡是没有动画的,才能让用户感觉是从第一个界面滑动到了最后一个界面。
如果当前页面是最后一个4,则向右滑动进入最后一个0界面,方法同上边相同,就不多做阐述。
4、最后很重要的一点
由于这个viewpager有7个页面,但我们只显示5个,左边和右边的界面是不全部展示的。因此在进入此viewpager界面时需要将mViewPager.setCurrentItem(1);这样就能直接显示图:1-1中的0界面。
总结:由于这是第一个写博客,对编辑文章的工具不是很熟悉,为了保证代码的美观都是通过图片来显示,对各位带来了不便,深表歉意。文中也许会出现很多错别字以及不通顺的地方,还请各位指出。
效果图也不知道怎么做,知道的各位告诉我 ,做好了发上来。