- ViewPager做自动轮播相信大家都会的。思路五花八门的,之前看到郭霖的博客,他就完全不使用ViewPager,去自己自定义一个View来做。
- 但是,我当然做不到这样。我的实现方式就是:
- 1.在
ViewPager
第一次显示的时候(onCreate/onCreateView
中)就用Handler
去执行一个延时任务,延时假设2秒,然后去选中下一页。
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
vPager.setCurrentItem(vPager.getCurrentItem() + 1);
}
}, 2000);
- 2.实现
ViewPager
的ViewPager.OnPageChangeListener
接口,然后比如需要重写3个抽象方法,其中,在onPageSelected(int position)
方法中再次执行相同的延时任务,依然是使用Handler
去实现。
- 1.在
- 经过以上两步就实现了
ViewPager
的自动轮播了。当然,前提是先设置成无限轮播。关于无限轮播,相信大家也都会的吧。
- 关于无限轮播,我也简单说一下我的实现思路:
- 1.在给
ViewPager
设置PagerAdapter
的时候,重写getCount()
的时候,直接return Integer.MAX_VALUE;
- 2.在
PagerAdapter
的instantiateItem(ViewGroup container, int position)
的时候要特别注意,数据的获取,不要越界了。比如,我这样做就不会越界了ImageView iv = new ImageView(context);
iv.setImageResource(data.get(position % data.size())); - 3.好了
PagerAdapter
中只要关注1,2两点即可。然后就是在第一次进入的时候需要设置当前选中的页,一定是一个中间值,而不是第一页,比如我这样设置的:vPager.setCurrentItem(Integer.MAX_VALUE / 2 - (Integer.MAX_VALUE / 2)
% vpagerDatas.size());
- 1.在给
- 关于无限轮播,我也简单说一下我的实现思路:
- Ok,关于无限轮播的小插曲就这样子了,不必过多介绍的吧。
- 然后就是一个头疼的问题,就是在
ViewPager
自动轮播的时候,手指触摸,手动滑动怎么处理? - 我在网上看了很多的博客,真没有感觉实现的很好的,有的根本就没有去处理,有的处理了,但是感觉很复杂,看不太懂,不好移植。
- 这里,我就分享一下我的处理方式,自认为是我看到的所有博客中,最简单的一种方式,当然,也是看到了网上的博客给了我一些启发的,处理起来就一行代码。
- 只要在
ViewPager.OnPageChangeListener.onPageScrollStateChanged(int state)
的这里里面做一下处理就好了。
@Override
public void onPageScrollStateChanged(int state) {
switch (state) {
case ViewPager.SCROLL_STATE_DRAGGING://手指滑动状态
mHandler.removeCallbacksAndMessages(null);
break;
case ViewPager.SCROLL_STATE
IDLE://停止状态
break;
case ViewPager.SCROLL_STATE_SETTLING://自动滑动状态
break;
default:
break;
}
}
说白了就是在ViewPager.SCROLL_STATE_DRAGGING://手指滑动状态,去取消Handler的延时翻页的任务就可以了。
- 有人可能会担心,这样做会不会导致手指离开之后,后面也不会自动轮播了呢?
- 不会的。因为在手指离开之后,又会走到页面选中的回调,到时候,又会发起一个延时翻页的任务。
- 不会的。因为在手指离开之后,又会走到页面选中的回调,到时候,又会发起一个延时翻页的任务。
- 有人可能会担心,这样做会不会导致手指离开之后,后面也不会自动轮播了呢?
总结:通过
Handler
首次发起延时翻页任务+在ViewPager.OnPageChangeListener.onPageSelected(int position)
中实现页面选中后,再次发起延时翻页的任务来进行的无限轮播 的 触摸处理可以是: 在ViewPager.SCROLL_STATE_DRAGGING://手指滑动状态,去取消Handler的延时翻页的任务。- 最后,因为这么项目里面包含很多无关的内容,暂时就不上传Demo了。
`