Unlimited/Dynamic ViewPager in both directions
Will this help,
public static class MyAdapter extends FragmentPagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public Fragment getItem(int position) { return getFragmentBasedOnPosition(position); } private Fragment getFragmentBasedOnPosition(int position) { int fragmentPos = position % 3; // Assuming you have 3 fragments switch(fragmentPos) { case 1: return Fragment1.newInstance(); case 2: return Fragment2.newInstance(); case 3: return Fragment3.newInstance(); } }}
and then,
mPager.setCurrentItem((int)(Integer.MAX_VALUE/2));
// assuming mPager is your ViewPager
Using negative position values stands very far from natural order of ViewPager usage and is not the Adapter issue at all. Please have a look into the source code of ViewPager in the support package source in Android SDK. For example, here is a setCurrentItemInternal private implementation:
void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) { if (mAdapter == null || mAdapter.getCount() <= 0) { setScrollingCacheEnabled(false); return; } if (!always && mCurItem == item && mItems.size() != 0) { setScrollingCacheEnabled(false); return; } if (item < 0) { item = 0; } else if (item >= mAdapter.getCount()) { item = mAdapter.getCount() - 1; } final int pageLimit = mOffscreenPageLimit; if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) { // We are doing a jump by more than one page. To avoid // glitches, we want to keep all current pages in the view // until the scroll ends. for (int i=0; i<mItems.size(); i++) { mItems.get(i).scrolling = true; } } final boolean dispatchSelected = mCurItem != item; populate(item); scrollToItem(item, smoothScroll, velocity, dispatchSelected);}
As you can see, ViewPager explicitly assumes no negative position values.