2013-05-26 12 views
16

मैं कई महीनों के लिए अपने ऐप्स में से एक में FragmentStatePagerAdapter का उपयोग कर रहा हूं, और यह बेकार ढंग से काम करता है। मैंने हाल ही में इंटेलिजे आईडीईए पर स्विच किया है और एडीटी 22 में अपडेट किया है और अब एडाप्टर ऐप को मजबूर करने का कारण बनता है जब ऐप टैब को नष्ट करने और नए बनाने की कोशिश करता है।FragmentStatePagerAdapter एडीटी 22 को अपडेट करने के बाद काम करना बंद कर दिया?

सही तरीके से काम करते समय, गतिविधि टैब की श्रृंखला लोड करेगी। उपयोगकर्ता उनके बीच स्वाइप कर सकते हैं। यह सब अभी भी सही ढंग से काम करता है।

ऐप को इन टैब को नष्ट करना चाहिए और उपयोगकर्ता को मेनू में बटन चुनने पर नए बनाना चाहिए। आम तौर पर, यह ठीक काम करता है लेकिन अब यह अचानक काम करना बंद कर दिया है। यहाँ कोड है:

/** 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() फोन, और इसे सफलतापूर्वक टैब बनाता है और उपयोगकर्ता स्वाइप कर सकते हैं। यह तभी होता है जब पेजर टैब को नष्ट करने और नए बनाने की कोशिश करता है कि अब यह अचानक विफल हो जाता है, भले ही मैं 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) 
+0

http://stackoverflow.com/questions/16636039/java-lang-classnotfoundexception-after-changing-nothing-in-the-project-but-upgra/16636127#16636127 यह कोशिश अगर यह मदद करता है – Raghunandan

+0

है एक परियोजना को साफ करने और IntelliJ में इसे पुनर्निर्माण करने का कोई तरीका है? यह ग्रहण उपयोगकर्ताओं के लिए एक समाधान प्रतीत होता है। इसके अलावा, अगर यह मदद करता है, तो ऐप सही तरीके से बनाता है और अन्यथा चलता है और ठीक काम करता है। यह एक चीज केवल असफल होने लगती है। – Ninjalan

+0

नहीं, मैंने इंटेलिज का उपयोग नहीं किया है। मुझे उस – Raghunandan

उत्तर

21

एडीटी 22 के बाद PagerAdapter (notifyDataSetChanged बुला के बारे में बहुत सख्त हो गया है) getCount कॉल करने से पहले()। यह स्पष्ट रूप से ट्रैक करता है कि यह क्या सोचता है कि गिनती होनी चाहिए और यदि यह समान नहीं है कि getCount() क्या देता है तो यह अपवाद फेंकता है। तो समाधान डेटा के आकार में हर बार एडाप्टर पर अधिसूचनाडेटासेट चेंज() को कॉल करने के लिए है।

मेरे मामले में मेरे पास एक पृष्ठभूमि कार्य है जो डेटा की एक सरणी बना रहा है। सरणी भरने के बाद मैं POSTExecute() में NotataDataSetChanged() को कॉल करता हूं। जब मेरे पासपोस्टएक्सक्यूट() पर कोई पथ था, जिसने सूचित नहीं किया थाडेटाट चेंज() मुझे अपवाद मिल रहा था।

+0

एचएम, समझ में आता है, लेकिन मुझे यह तय करने में परेशानी हो रही है कि मुझे और कहां जाना चाहिए DataSetChanged()। जब भी कोई टैब जोड़ा या हटा दिया जाता है तो मैं विधि को कॉल करता हूं। मुझे लगता है कि यह आंकड़ों का आकार बदलने का एकमात्र समय होगा, है ना? – Ninjalan

+1

मैंने पाया कि अधिसूचना जोड़नाडेटाट चेंज(); TabSelected पर लूप के ठीक ऊपर() समस्या हल करता है लेकिन यह ऐप को अविश्वसनीय रूप से धीमा कर देता है। क्या कोई स्मार्ट जगह है जिसे मुझे रखा जाना चाहिए? – Ninjalan

+1

अपडेट: मैंने पाया कि अधिसूचना बढ़ानाडेटासेट चेंज(); टैब विधियों को जोड़ने और निकालने में चाल थी। यह मेरे मूल कोड में चलाने का आखिरी तरीका था, लेकिन कुछ कारणों से पेजर को पेज जोड़ने/निकालने के लिए इसे सीधे विधि के नीचे रखा गया था। यह अभी भी थोड़ा धीमा है, लेकिन यह काम करता है! – Ninjalan

0

आप अपने सभी जोड़ें/निकालें टैब तर्क से पहले ViewPager.setAdapter(null) पर कॉल कर सकते हैं और अंत में अद्यतन एडाप्टर के साथ पुन: असाइन कर सकते हैं। मेरी परेशानियों को हल किया।

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

सीधे नीचे दी गई विधि जोड़ें/पेजर काम किया था करने के लिए पेज को दूर करने के notifyDataSetChanged(); विधि का मौक़ा मिला। धन्यवाद @Ninjalan

0

Youtry सेट 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)); 
      } 

     } 
    }); 

} 
संबंधित मुद्दे