IllegalStateException: Der PagerAdapter der Anwendung hat den Inhalt des Adapters geändert, ohne den PagerAdapter # notifyDataSetChanged aufzurufen

Ich benutze dieViewPager Beispiel mitActionBar Registerkarten aus der Android-DokumentationHier.

Leider sobald ich das anrufeaddTab Methode stürzt die Anwendung mit der folgenden Ausnahme ab:

IllegalStateException: Der PagerAdapter der Anwendung hat den Inhalt des Adapters geändert, ohne den PagerAdapter # notifyDataSetChanged aufzurufen! Erwartete Anzahl der Adapterelemente 0, gefunden 1.

Dies ist dasFragmentPagerAdapter Code:

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) {
        }
    }
}

Ich ändere meinen Adapter in keinem anderen Teil meines Codes und rufe den aufaddTab Methode aus dem Hauptthread, demaddTab Methode endet mit einem Aufruf vonnotifyDataSetChanged. In der Dokumentation wird Folgendes empfohlen:

PagerAdapter unterstützt Datensatzänderungen. Datensatzänderungen müssen im Hauptthread erfolgen und mit einem Aufruf von notifyDataSetChanged () enden, der den von BaseAdapter abgeleiteten AdapterView-Adaptern ähnelt.

Antworten auf die Frage(9)

Ihre Antwort auf die Frage