This is actually normal behavior. In fact, since you map the ViewPager to the adapter, the adapter creates the first visible layout (index 0), ending with the next (index 1). This is done by default in the "setAdapter". Then, when you set a different position, the adapter will create an instance of the fragment at the selected index, previous and next.
This is the usual setAdapter code for the ViewPager:
public void setAdapter(PagerAdapter adapter) { if (mAdapter != null) { mAdapter.setViewPagerObserver(null); mAdapter.startUpdate(this); for (int i = 0; i < mItems.size(); i++) { final ItemInfo ii = mItems.get(i); mAdapter.destroyItem(this, ii.position, ii.object); } mAdapter.finishUpdate(this); mItems.clear(); removeNonDecorViews(); mCurItem = 0; scrollTo(0, 0); } final PagerAdapter oldAdapter = mAdapter; mAdapter = adapter; mExpectedAdapterCount = 0; if (mAdapter != null) { if (mObserver == null) { mObserver = new PagerObserver(); } mAdapter.setViewPagerObserver(mObserver); mPopulatePending = false; final boolean wasFirstLayout = mFirstLayout; mFirstLayout = true; mExpectedAdapterCount = mAdapter.getCount(); if (mRestoredCurItem >= 0) { mAdapter.restoreState(mRestoredAdapterState, mRestoredClassLoader); setCurrentItemInternal(mRestoredCurItem, false, true); mRestoredCurItem = -1; mRestoredAdapterState = null; mRestoredClassLoader = null; } else if (!wasFirstLayout) { populate(); } else { requestLayout(); } } if (mAdapterChangeListener != null && oldAdapter != adapter) { mAdapterChangeListener.onAdapterChanged(oldAdapter, adapter); } }
To change the behavior of the ViewPager, you can extend the classic ViewPager by overriding the setAdapter method and set mCurrItem to the desired position.
I hope this helps
Edit:
After various tests, we found a solution.
If the ViewPager adapter is installed after the ViewPager layout is visible, items 0 and 1 are loaded. If you want to avoid this behavior, but you cannot install the adapter before the layout becomes visible (because you are waiting for data), you can use this workaround:
1) First set the visibility of the ViewPager to GONE
2) After receiving all the data, you will update the adapter and set the current value of the element
3) Finally, you set the visibility of the ViewPager to VISIBLE
Here you can find an example:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.detail_overview_fragment, container, false); final int position = getArguments().getInt("position"); final ViewPager viewPager = (ViewPager) v.findViewById(R.id.viewpager); viewPager.setVisibility(View.GONE); Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { viewPager.setAdapter(new PagerAdapter(getChildFragmentManager())); viewPager.setCurrentItem(position); viewPager.setVisibility(View.VISIBLE); } },5000); return v; }