IllegalStateException: Der PagerAdapter der Anwendung hat den Inhalt des Adapters geändert, ohne PagerAdapter # notifyDataSetChanged aufzurufen
Ich bin mit der ViewPager
Beispiel mit ActionBar
tabs genommen von der Android-Dokumentation hier.
Leider, sobald ich den Anruf addTab
Methode, die Anwendung stürzt mit folgender Ausnahme:
IllegalStateException: Die Anwendung PagerAdapter geändert
adapter Inhalt ohne Aufruf PagerAdapter#notifyDataSetChanged!
Erwartet adapter Anzahl der Elemente 0, 1.
Dies ist die FragmentPagerAdapter
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) {
}
}
}
Bin ich nicht verändern, meinen adapter in einem anderen Teil von meinem code, und ich bin dem Aufruf der addTab
Methode aus dem Haupt-thread, der addTab
Methode endet mit einem Aufruf notifyDataSetChanged
. Die Dokumentation empfiehlt, das zu tun:
PagerAdapter unterstützt Daten-änderungen. Daten festgelegt wurden, müssen die änderungen treten auf
der Haupt-thread und muss am Ende mit einem Aufruf notifyDataSetChanged()
ähnlich AdapterView Adapter abgeleitet von BaseAdapter.
InformationsquelleAutor der Frage Zagorax | 2014-04-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte eine harte Zeit meine
ViewPager
arbeiten. Am Ende, es scheint, das Beispiel in der Dokumentation falsch ist.Den
addTab
Methode soll wie folgt sein:Beachten Sie die Reihenfolge der letzten drei Operationen. In der original-Beispiel
notifyDataSetChanged
wurde nach dermActionBar.addTab
Funktion.Leider, sobald Sie rufen die
addTab
auf dieActionBar
die erste Registerkarte, die Sie hinzufügen, wird automatisch ausgewählt. Weil dieses, dieonTabSelected
- Ereignis ausgelöst wird, und beim Versuch zum abrufen von der Seite, es trhows dieIllegalStateException
weil es merkt, dass eine Diskrepanz zwischen der erwarteten Anzahl der Elemente und der tatsächlichen.InformationsquelleAutor der Antwort Zagorax
Ich es behoben, indem callinig notifyDataSetChanged() einmal und nur vor dem nächsten call of getCount():
InformationsquelleAutor der Antwort almisoft
Ich wurde immer diese Fehlermeldung, wie Sie unter Bezugnahme auf die Registerkarten innerhalb getCount():
Wenn instanziiert diese sollte entweder in übergeben werden als separate variable, oder die pager eingerichtet werden sollten nach wird die Sammlung aufgefüllt wurde /mutiert.
InformationsquelleAutor der Antwort Daniel Wilson
versuchen. Ich arbeitete
InformationsquelleAutor der Antwort Isa M
Mein Problem war nicht genau die gleichen, aber ähnlichen Kontext.
Habe ich ein AlertDialog immer gezeigt, in einem layout, das hat ViewPager und ist mit AppCompatActivity. Ich war immer der IllegalStateException und Absturz beim drehen des Bildschirms.
Danke für die Antworten, die Antwort von @almisoft und @Zagorax, ich habe versucht, den Aufruf
notifyDataSetChanged();
Recht, bevor ich das Dialogfeld, und das problem scheint verschwunden.InformationsquelleAutor der Antwort gnB
Ich hatte das gleiche problem in
FragmentStatePager
adapter. inonResume()
Beim initialisieren Sie den adpater undViewPager
denselben Fehler, derIllegalStateException
angezeigt werden. Die Lösung:Beim hinzufügen Registerkarte
addtab
wählen Sie die Registerkarte nicht ausgewählt ist, durch die Einstellung setSelected params auf false.Ich denke, die Ausnahme erschien, weil das überschreiben der
onTabSelected()
Methode wie im folgendenAlso beim Aufruf
addTab()
es nicht erkennen, die viewPager und adapter hinzufügen, die tab.InformationsquelleAutor der Antwort Amt87
fügen Sie diese Zeile in Ihrem adapter-Datei, wo die
public Object instantiateItem(ViewGroup container, int position)
Methode wird aufgerufen,
((ViewPager) - container).addView(view);
return view;
InformationsquelleAutor der Antwort Dhaval Barot
Stellen Sie sicher, dass die Werte in setOffscreenPageLimit und getCount übereinstimmen, sonst erhalten Sie diese Fehlermeldung:
InformationsquelleAutor der Antwort 40-Love
Einer Zeile beantworten Sie nur hinzufügen viewpageadapter.notifyDataSetChanded()
InformationsquelleAutor der Antwort Vikash Sharma