Skip to content

Instantly share code, notes, and snippets.

@BramYeh
Created August 15, 2017 05:08
Show Gist options
  • Save BramYeh/ebdb0d13d786fd651efc8f21c12e921c to your computer and use it in GitHub Desktop.
Save BramYeh/ebdb0d13d786fd651efc8f21c12e921c to your computer and use it in GitHub Desktop.
CyclePagerAdapter Example
public abstract class CyclePagerAdapter<T> extends PagerAdapter implements ViewPager.OnPageChangeListener {
protected List<T> mItemList = null;
private WeakReference<CycleViewPager> mViewPagerRef = null;
public CyclePagerAdapter(@NonNull List<T> list, @NonNull CycleViewPager cycleViewPager) {
if (list.size() <= 1) {
// needn't to support infinite cycle
mItemList = new ArrayList<>(list);
} else {
// refer: https://maniacdev.com/2013/08/tutorial-how-to-create-an-infinite-scrolling-uicollectionview
mItemList = new ArrayList<>(ArrayUtils.getLengthSafe(list) + 2);
mItemList.add(list.get(ArrayUtils.getLengthSafe(list) - 1));
mItemList.addAll(list);
mItemList.add(list.get(0));
}
cycleViewPager.addOnPageChangeListener(this);
mViewPagerRef = new WeakReference<>(cycleViewPager);
}
public boolean isCycleEnable() {
return getCount() > 1;
}
protected boolean isFakePosition(@IntRange(from = 0) int position) {
if (isCycleEnable()) {
return position == 0 || position == ArrayUtils.getLengthSafe(mItemList) - 1;
}
return false;
}
public int getCyclePosition(@IntRange(from = 0) int actualPosition) {
int cyclePosition = actualPosition;
if (isCycleEnable()) {
cyclePosition = (cyclePosition - 1) % (getCount() - 2);
}
return cyclePosition;
}
@Override
public int getCount() {
return ArrayUtils.getLengthSafe(mItemList);
}
@CallSuper
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// no operation
}
@CallSuper
@Override
public void onPageSelected(int position) {
// no operation
}
@CallSuper
@Override
public void onPageScrollStateChanged(int state) {
if (mViewPagerRef == null || mViewPagerRef.get() == null || !isCycleEnable()) {
return;
}
CycleViewPager viewPager = mViewPagerRef.get();
if (viewPager.getCurrentItem() == getCount() - 1) {
viewPager.post(new Runnable() {
@Override
public void run() {
if (mViewPagerRef == null || mViewPagerRef.get() == null) {
return;
}
ViewPager viewPager = mViewPagerRef.get();
if (viewPager.getCurrentItem() == getCount() - 1) {
viewPager.setCurrentItem(1, false);
}
}
});
} else if (viewPager.getCurrentItem() == 0) {
viewPager.post(new Runnable() {
@Override
public void run() {
if (mViewPagerRef == null || mViewPagerRef.get() == null) {
return;
}
ViewPager viewPager = mViewPagerRef.get();
if (viewPager.getCurrentItem() == 0) {
viewPager.setCurrentItem(getCount() - 2, false);
}
}
});
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment