Created
August 15, 2017 05:08
-
-
Save BramYeh/ebdb0d13d786fd651efc8f21c12e921c to your computer and use it in GitHub Desktop.
CyclePagerAdapter Example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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