ich das ViewPager
Beispiel mit ActionBar
Tabs aus dem Android Dokumentation here genommen werden.Illegal: Die PagerAdapter Anwendung verändert den Inhalt des Adapters ohne PagerAdapter # Aufruf notifyDataSetChanged
Leider sobald ich die addTab
Methode aufrufen, die Anwendung abstürzt, mit folgender Ausnahme:
Illegal: Die PagerAdapter Anwendung verändert den Inhalt des Adapter ohne PagerAdapter # notifyDataSetChanged ruft! Erwartete Adapter Elementanzahl 0, gefunden 1.
Dies ist der 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) {
}
}
}
Ich erhalte kein Adapter in einem anderen Teil meines Codes ändern und ich rufe die addTab
Methode aus dem Haupt-Thread, endet die addTab
Methode mit einem Aufruf an notifyDataSetChanged
. Wie in der Dokumentation empfohlen:
PagerAdapter unterstützt Datensatzänderungen. Datensatzänderungen müssen unter dem Hauptthread erfolgen und müssen mit einem Aufruf von notifyDataSetChanged() ähnlich den von BaseAdapter abgeleiteten AdapterView-Adaptern enden.
Ich habe für diese eine Weile suchen. Bin ich der Einzige, der es seltsam findet, dass der Fehler so aussieht, als würde ich notifyDataSetChanged() nicht aufrufen, wenn ich wirklich nur die Aktion (setCurrentItem in meinem Fall) nach NotifyDataSetChanged() ausführen muss? – wizurd