package com.marshalchen.common.uimodule.slider.Tricks; import android.content.Context; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.AttributeSet; /** * A {@link android.support.v4.view.ViewPager} that allows pseudo-infinite paging with a wrap-around effect. Should be used with an {@link * InfinitePagerAdapter}. */ public class InfiniteViewPager extends ViewPagerEx { public InfiniteViewPager(Context context) { super(context); } public InfiniteViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void setAdapter(PagerAdapter adapter) { super.setAdapter(adapter); // offset first element so that we can scroll to the left setCurrentItem(0); } @Override public void setCurrentItem(int item) { // offset the current item to ensure there is space to scroll item = getOffsetAmount() + (item % getAdapter().getCount()); super.setCurrentItem(item); } public void nextItem(){ super.setCurrentItem(getCurrentItem() + 1); } private int getOffsetAmount() { if (getAdapter() instanceof InfinitePagerAdapter) { InfinitePagerAdapter infAdapter = (InfinitePagerAdapter) getAdapter(); // allow for 100 back cycles from the beginning // should be enough to create an illusion of infinity // warning: scrolling to very high values (1,000,000+) results in // strange drawing behaviour return infAdapter.getRealCount() * 100; } else { return 0; } } }