无限循环,自动滚动的ViewPager
实现原理:在第一张图片前加一张最后一张图片,在最后一张图片后加一张第一张图片。在滚动到最后一张图片的时候让他默认指向第一张图片。
具体添加类如下,无需改变代码现有结构,只需要设置Viewpager类以及添加adpter即可。
package com.imfclub.stock.view;
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by GuoJing on 2015/5/7.
*/
public class HeadViewPager extends ViewPager implements Runnable {
private PagerAdapter pagerAdapter;
private static final int POST_DELAYED_TIME = 1000 * 5;
private boolean touching;
private PagerAdapter myPagerAdapter;
public HeadViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
postDelayed(this, POST_DELAYED_TIME);
}
private class MyPagerAdapter extends PagerAdapter {
private PagerAdapter pa;
public MyPagerAdapter(PagerAdapter pa) {
this.pa = pa;
}
@Override
public int getCount() {
return pa.getCount() > 1 ? pa.getCount() + 2 : pa.getCount();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (position == 0) {
return pa.instantiateItem(container, pa.getCount() - 1);
} else if (position == pa.getCount() + 1) {
return pa.instantiateItem(container, 0);
} else {
return pa.instantiateItem(container, position - 1);
}
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
pa.destroyItem(container, position, object);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return pa.isViewFromObject(arg0, arg1);
}
}
private class MyOnPageChangeListener implements OnPageChangeListener {
private OnPageChangeListener listener;
private boolean alreadyTriggerOnPageSelected;
public MyOnPageChangeListener(OnPageChangeListener listener) {
this.listener = listener;
}
@Override
public void onPageScrollStateChanged(int arg0) {
if (arg0 == SCROLL_STATE_IDLE) {
if (getCurrentItem() + 1 == 0) {
setCurrentItem(pagerAdapter.getCount() - 1, false);
} else if (getCurrentItem() + 1 == pagerAdapter.getCount() + 1) {
setCurrentItem(0, false);
}
}
listener.onPageScrollStateChanged(arg0);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
listener.onPageScrolled(arg0, arg1, arg2);
}
@Override
public void onPageSelected(int arg0) {
if (arg0 == 0) {
listener.onPageSelected(pagerAdapter.getCount() - 1);
alreadyTriggerOnPageSelected = true;
} else if (arg0 == pagerAdapter.getCount() + 1) {
listener.onPageSelected(0);
alreadyTriggerOnPageSelected = true;
} else {
if (!alreadyTriggerOnPageSelected) {
listener.onPageSelected(arg0 - 1);
}
alreadyTriggerOnPageSelected = false;
}
}
}
@Override
public void setOnPageChangeListener(OnPageChangeListener listener) {
super.setOnPageChangeListener(listener == null ? null
: new MyOnPageChangeListener(listener));
}
@Override
public void setAdapter(PagerAdapter arg0) {
myPagerAdapter = arg0 == null ? null : new MyPagerAdapter(arg0);
super.setAdapter(myPagerAdapter);
if (arg0 != null && arg0.getCount() != 0) {
setCurrentItem(0, false);
}
this.pagerAdapter = arg0;
}
@Override
public PagerAdapter getAdapter() {
return pagerAdapter;
}
public PagerAdapter getMyPagerAdapter() {
return myPagerAdapter;
}
@Override
public int getCurrentItem() {
return super.getCurrentItem() - 1;
}
@Override
public void setCurrentItem(int item) {
setCurrentItem(item, true);
}
@Override
public void setCurrentItem(int item, boolean smoothScroll) {
super.setCurrentItem(item + 1, smoothScroll);
}
@Override
public void run() {
if (getAdapter() != null && getAdapter().getCount() > 1 && !touching) {
setCurrentItem(getCurrentItem() + 1, true);
}
postDelayed(this, POST_DELAYED_TIME);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
this.touching = true;
} else if (event.getAction() == MotionEvent.ACTION_UP
|| event.getAction() == MotionEvent.ACTION_CANCEL) {
this.touching = false;
}
return super.onTouchEvent(event);
}
}
更新数据必须调用
public PagerAdapter getMyPagerAdapter() { return myPagerAdapter; }
方法获取到的PagerAdapter