sto usando l'esempio ViewPager
con ActionBar
schede tratte dalla documentazione di Android here.IllegalStateException: PagerAdapter L'dell'applicazione cambiato il contenuto della scheda senza chiamare PagerAdapter # notifyDataSetChanged
Purtroppo, non appena chiamo il metodo addTab
, l'applicazione si blocca con la seguente eccezione:
IllegalStateException: PagerAdapter L'dell'applicazione cambiato il contenuto della scheda senza chiamare PagerAdapter # notifyDataSetChanged! Previsto conteggio degli elementi adattatore 0, trovato 1.
Questo è il codice FragmentPagerAdapter
:
public static class TabsAdapter extends FragmentPagerAdapter
implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
private final Context mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
static final class TabInfo {
private final Class<?> clss;
private final Bundle args;
TabInfo(Class<?> _class, Bundle _args) {
clss = _class;
args = _args;
}
}
public TabsAdapter(Activity activity, ViewPager pager) {
super(activity.getFragmentManager());
mContext = activity;
mActionBar = activity.getActionBar();
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
}
public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
TabInfo info = new TabInfo(clss, args);
tab.setTag(info);
tab.setTabListener(this);
mTabs.add(info);
mActionBar.addTab(tab);
notifyDataSetChanged();
}
@Override
public int getCount() {
return mTabs.size();
}
@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext, info.clss.getName(), info.args);
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mActionBar.setSelectedNavigationItem(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Object tag = tab.getTag();
for (int i=0; i<mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mViewPager.setCurrentItem(i);
}
}
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
}
non sto modificando il mio adattatore in qualsiasi altra parte del mio codice e sto chiamando il addTab
metodo dal thread principale, il metodo addTab
termina con una chiamata a notifyDataSetChanged
. Come suggerisce la documentazione:
PagerAdapter supporta le modifiche del set di dati. Le modifiche al set di dati devono essere eseguite su il thread principale e devono terminare con una chiamata a notifyDataSetChanged() simile agli adattatori AdapterView derivati da BaseAdapter.
Ho cercato per questo per un po '. Sono l'unico che trova strano che l'errore si legge come se non stessi chiamando notifyDataSetChanged(), quando in realtà ho solo bisogno di eseguire l'azione (setCurrentItem nel mio caso) After notifyDataSetChanged()? – wizurd