更新到ADT 22后,FragmentStatePagerAdapter停止工作?

我已经在我的一个应用程序中使用了FragmentStatePagerAdapter好几个月了,并且工作起来非常完美。 我最近切换到IntelliJ IDEA并更新到ADT 22,现在适配器导致应用程序强制closures,当应用程序试图摧毁制表符,并创build新的。

正常工作时,活动将加载一系列选项卡。 用户可以在它们之间滑动。 所有这一切仍然正常工作。

应用程序应该销毁这些选项卡,并在用户select菜单中的button时创build新的选项卡。 通常情况下,这工作得很好,但现在突然停止工作。 这里是代码:

/** TabsAdapter - Make Tabs Swipe-Able, Handle Fragments */ public static class TabsAdapter extends FragmentStatePagerAdapter 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; } } // end TabInfo public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) { super(activity.getSupportFragmentManager()); mContext = activity; mActionBar = activity.getSupportActionBar(); mViewPager = pager; mViewPager.setAdapter(this); mViewPager.setOnPageChangeListener(this); } // end TabsAdapter 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(); } // end addTab public void removeTab(ActionBar.Tab tab) { mTabs.remove(tab.getTag()); mActionBar.removeTab(tab); notifyDataSetChanged(); } @Override public int getItemPosition(Object object) { return TabsAdapter.POSITION_NONE; } @Override public int getCount() { return mTabs.size(); } // end getCount() @Override public Fragment getItem(int position) { TabInfo info = mTabs.get(position); return Fragment.instantiate(mContext, info.clss.getName(), info.args); } // end getItem() @Override public void onPageScrolled(int position, float positionOffest, int postionOffsetPixels){ } // end onPageScrolled @Override public void onPageSelected(int position) { mActionBar.setSelectedNavigationItem(position); } // end onPageSelected @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); } } } // end onTabSelected @Override public void onTabUnselected(Tab tab, FragmentTransaction ft){} // end onTabUnselected @Override public void onTabReselected(Tab tab, FragmentTransaction ft){} // end onTabReselected @Override public void onPageScrollStateChanged(int arg0) {} } // end TabsAdapter 

在onCreate()期间,我调用了一个方法,我们称之为CreateTabs1(),它成功地生成了标签,用户可以滑动。 只有当寻呼机试图销毁标签并创build新的标签时,即使我再次调用CreateTabs1(),它现在也会突然失败。 再一次,这总是完美的工作之前。

这里是日志:

 05-25 23:41:24.857: ERROR/AndroidRuntime(27290): FATAL EXCEPTION: main java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 11, found: 10 Pager id: com.######:id/pager Pager class: class android.support.v4.view.ViewPager Problematic adapter: class com.#####.######.#####$TabsAdapter at android.support.v4.view.ViewPager.populate(ViewPager.java:959) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:548) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:507) at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:488) at com.#####.#####.#####$TabsAdapter.onTabSelected(#####.java:215) at com.actionbarsherlock.internal.app.ActionBarWrapper$TabWrapper.onTabSelected(ActionBarWrapper.java:356) at com.android.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java:570) at com.android.internal.app.ActionBarImpl.removeTabAt(ActionBarImpl.java:544) at com.android.internal.app.ActionBarImpl.removeTab(ActionBarImpl.java:520) at com.actionbarsherlock.internal.app.ActionBarWrapper.removeTab(ActionBarWrapper.java:409) at com.#####.#####.#####$TabsAdapter.removeTab(#####.java:181) at com.#####.#####.#####.tabDrop(#####.java:381) at com.#####.#####.#####.onOptionsItemSelected(#####.java:459) at android.support.v4.app.Watson.onMenuItemSelected(Watson.java:118) at com.actionbarsherlock.ActionBarSherlock.callbackOptionsItemSelected(ActionBarSherlock.java:603) at com.actionbarsherlock.internal.ActionBarSherlockNative.dispatchOptionsItemSelected(ActionBarSherlockNative.java:93) at com.actionbarsherlock.app.SherlockFragmentActivity.onMenuItemSelected(SherlockFragmentActivity.java:205) at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:980) at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735) at com.android.internal.view.menu.SubMenuBuilder.dispatchMenuItemSelected(SubMenuBuilder.java:81) at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149) at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) at com.android.internal.view.menu.MenuPopupHelper.onItemClick(MenuPopupHelper.java:156) at android.widget.AdapterView.performItemClick(AdapterView.java:298) at android.widget.AbsListView.performItemClick(AbsListView.java:1100) at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749) at android.widget.AbsListView$1.run(AbsListView.java:3423) at android.os.Handler.handleCallback(Handler.java:725) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5041) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method) 

Solutions Collecting From Web of "更新到ADT 22后,FragmentStatePagerAdapter停止工作?"

在ADT 22之后,PagerAdapter在调用getCount()之前已经非常严格地调用了notifyDataSetChanged()。 它显然跟踪了它认为count应该是什么,如果这不是什么getCount()返回它抛出此exception。 因此,每当数据大小发生变化时,解决scheme只需在适配器上调用notifyDataSetChanged()。

在我的情况下,我有一个后台任务是创build一个数组的数据。 数组填充后,我调用onPostExecute()中的notifyDataSetChanged()。 当我没有调用notifyDataSetChanged()的onPostExecute()中有一个path我得到exception。

放置notifyDataSetChanged(); 方法直接在方法的下面添加/删除页面到分页器没有工作。 谢谢@Ninjalan

您可以在所有添加/删除选项卡逻辑之前调用ViewPager.setAdapter(null)并在最后重新分配更新的适配器。 解决了我的烦恼。

 mPager.setAdapter(null); mTabHost.clearAllTabs(); mTabHost.addTab(...); mTabHost.addTab(...); mTabHost.addTab(...); mPager.setAdapter(YOUR_UPDATED_ADAPTER_HERE); 

Youtry set Codeing myViewPagerAdapter.notifyDataSetChanged();

 @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); feedItemComics = (FeedItemComics) getArguments().getSerializable( DESCRIBABLE_KEY); feedItemComics.getTitle(); feedItemComics.getLast_modified(); sceneNo.setText(feedItemComics.getScene_no()); title.setText(feedItemComics.getTitle()); // Logger.Log("feedItemComics.getThumbnail", feedItemComics.getLast_modified()); Logger.Log("feedItemComics.getTitle", feedItemComics.getTitle()); itemComicses = (ArrayList<FeedItemComics>) getArguments().getSerializable("images"); // feedItemList = (ArrayList<FeedItemComics>) getArguments().getSerializable("images"); selectedPosition = getArguments().getInt("position"); Logger.Log("itemComicses size", String.valueOf(itemComicses.size())); Logger.Log("selectedPosition", String.valueOf(selectedPosition)); myViewPagerAdapter.notifyDataSetChanged(); clickPrevious.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(viewPager.getCurrentItem()-1 < itemComicses.size()+1 ){ viewPager.setCurrentItem(viewPager.getCurrentItem()-1); Logger.Log("position " , String.valueOf(viewPager.getCurrentItem()-1)); } } }); clickNext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(viewPager.getCurrentItem()+1 < itemComicses.size() ){ viewPager.setCurrentItem(viewPager.getCurrentItem()+1); Logger.Log("position " , String.valueOf(viewPager.getCurrentItem()+1)); } } }); }