IllegalStateException: The application's PagerAdapter changed the adapter's content without calling PagerAdapter#notifyDataSetChanged
I had a hard time making my ViewPager
working. At the end, it seems that the example in the documentation is wrong.
The addTab
method should be as follows:
public void addTab(Tab tab, Class<?> clss, Bundle args) { TabInfo info = new TabInfo(clss, args); tab.setTag(info); tab.setTabListener(this); mTabs.add(info); notifyDataSetChanged(); mActionBar.addTab(tab); }
Notice the order of the last three operations. In the original example, notifyDataSetChanged
was called after the mActionBar.addTab
function.
Unfortunately, as soon as you call the addTab
on the ActionBar
, the first tab you add is automatically selected. Because of this, the onTabSelected
event is fired and while trying to retrieve the page, it throws the IllegalStateException
because it notices a discrepancy between the expected item count and the actual one.
I fixed it by callinig notifyDataSetChanged() once and just before next call of getCount():
private boolean doNotifyDataSetChangedOnce = false;@Overridepublic int getCount() { if (doNotifyDataSetChangedOnce) { doNotifyDataSetChangedOnce = false; notifyDataSetChanged(); } return actionBar.getTabCount();}private void addTab(String text) { doNotifyDataSetChangedOnce = true; Tab tab = actionBar.newTab(); tab.setText(text); tab.setTabListener(this); actionBar.addTab(tab);}private void removeTab(int position) { doNotifyDataSetChangedOnce = true; actionBar.removeTabAt(position);}
I was getting this error like you by referencing the tabs within getCount():
@Override public int getCount() { return mTabs.size(); }
When instantiated this should either be passed in as a separate variable, or the pager should be set up after the collection has been populated / mutated.