我使用ViewPager进行图片轮播时候,发现当到了开头或末尾不能再继续了,此时是因为PagerAdapter中的getCount方法进行了限定,明确了具体的数量,当到达数量的时候的,就不在进行调用instantiateItem方法了。如果想改变的话我们可以将getCount中返回值设置为最大值即可,即:Integer.MAX_VALUE。
public int getCount() { return Integer.MAX_VALUE; }
在获取位置处进行取模操作 % 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(); }
hand.sendEmptyMessageDelayed(0, 4000);
Handler hand = new Handler(){ @Override public void handleMessage(Message msg) { viewPage.setCurrentItem(viewPage.getCurrentItem()+1); hand.sendEmptyMessageDelayed(0, 4000); } };
//暂停 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; } });