右滑轮播问题解决
我使用ViewPager进行图片轮播时候,发现当到了开头或末尾不能再继续了,此时是因为PagerAdapter中的getCount方法进行了限定,明确了具体的数量,当到达数量的时候的,就不在进行调用instantiateItem方法了。如果想改变的话我们可以将getCount中返回值设置为最大值即可,即:Integer.MAX_VALUE。
public int getCount() {
return Integer.MAX_VALUE;
}
我们还需要在instantiateItem和 updateIntroAndDot中
在获取位置处进行取模操作 % list.size()
@Override
public Object instantiateItem(ViewGroup container, int position) {
//将广告布局添加进来
View view = View.inflate(MainActivity.this, R.layout.adapter_ad, null);
//获取到布局中ImageView
ImageView imageView = (ImageView) view.findViewById(R.id.img);
//获取到集合中指定的AD数据
Ad ad = list.get(position % list.size());
//将图片设置到ImageView 上
imageView.setImageResource(ad.getResId());
//一定不能少,将view加入到viewPager中
container.addView(view);
return view;
}
private void updateIntroAndDot() {
//获取到当前第几页
int currentPage = viewPage.getCurrentItem() % list.size();
//设置文本信息
tv.setText(list.get(currentPage).getIntro());
for (int i = 0; i < lay_dot.getChildCount(); i++) {
lay_dot.getChildAt(i).setEnabled(i == currentPage);
}
}
左滑轮播问题解决
但是我们会发现当在第一个的时候向左滑动是有问题的,我们需要解决这个问题
1、我们需要在initData中设置 当前的item
2、我们发现Integer.MAX_VALUE/2; //正好在中间的位置
3、currentItem % list.size();能够获取到和第一个位置0的差值
4、用2中的值减去3中的差值 作为参数传递到instantiateItem方法中去的时候再 % list.size();就是0
/**
* 初始化数据
*/
private void initData() {
list.add(new Ad(R.drawable.a, "不低俗,不能低俗"));
list.add(new Ad(R.drawable.b, "回来了,再唱经典老歌引百万人同唱啊"));
list.add(new Ad(R.drawable.c, "电影如何升级"));
list.add(new Ad(R.drawable.d, "TV版大放送"));
list.add(new Ad(R.drawable.e, "热血的反杀"));
initDot();
tv.setText(list.get(0).getIntro());
//绑定Adapter
viewPage.setAdapter(new MyPagerAdapter());
//当第一屏的时候 解决向左滑动问题
int currentItem = Integer.MAX_VALUE/2; //正好在中间的位置
int value = currentItem % list.size();
viewPage.setCurrentItem(currentItem - value);
//更新数据
updateIntroAndDot();
}
最后我们实现自动播放
在initData()中添加 延迟操作 ,也就是说第一个图片的时候 发送一个空消息 延迟操作到handler中去
hand.sendEmptyMessageDelayed(0, 4000);
定义Handler进行操作,在handler中接收消息后,让当前的item增加1,然后自己再给自己发送空消息,形成循环,即可成为自动播放
Handler hand = new Handler(){
@Override
public void handleMessage(Message msg) {
viewPage.setCurrentItem(viewPage.getCurrentItem()+1);
hand.sendEmptyMessageDelayed(0, 4000);
}
};
触发触摸事件
在initData中进行处理
//暂停
viewPage.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//清除所有的callback 和 message
hand.removeCallbacksAndMessages(null);
break;
case MotionEvent.ACTION_UP:
//继续轮播
hand.sendEmptyMessageDelayed(0, 4000);
break;
}
return false;
}
});