2017-01-31 5 views
1

Ich habe einige Fragmente, die in meiner Hauptaktivität ausgetauscht werden. Das anfängliche Fragment wird BrowseHomeFragment und lädt fein anfangs genannt, aber wenn ich es mit einem neuen Fragment ersetzen und dann ersetzen zurück bekomme ich folgende FehlerFragment ViewPager NullPointer Ausgabe

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference 
    at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:686) 
    at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:215) 
    at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:536) 

onCreateView Methode BrowseHomeFragment:

public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { 
     InjectionGraph.inject(this); 

     View view = inflater.inflate(R.layout.fragment_browse, container, false); 
     ButterKnife.inject(this, view); 

     addTabsToPagerSlidingTabStrip(inflater); 

     viewPager.setAdapter(new BrowseHomePagerAdapter(getChildFragmentManager())); 

     pagerSlidingTabStrip.setViewPager(viewPager); 
     // has to set page change listener in indicator 
     pagerSlidingTabStrip.setOnPageChangeListener(pageChangeListener); 

     viewPager.setCurrentItem(initialTabIndex); 

     return view; 
    } 

BrowseHomePagerAdapter

public class BrowseHomePagerAdapter extends FragmentStatePagerAdapter { 
    private int lastPosition = -1; 

    @Inject 
    BrowseHomepageMetricRecorder browseHomepageMetricRecorder; 

    @Inject 
    NetworkMonitor networkMonitor; 


    /** 
    * For explanation on why Fragment references are cached, please refer to 
    * http://stackoverflow.com/questions/8785221/retrieve-a-fragment-from-a-viewpager 
    */ 
    final SparseArray<Fragment> registeredFragments = new SparseArray<>(); 


    public BrowseHomePagerAdapter(FragmentManager fm) { 
     super(fm); 
     InjectionGraph.inject(this); 

    } 


    @Override 
    public Fragment getItem(int i) { 

     switch (BrowseHomeFragment.Tab.resolve(i)) { 
     // TODO: connect category, favorite, and downloaded list fragments 
     case Categories: 
      return new CategoryHomePageFragment(); 
     case Downloaded: 
      return new OfflineContentFragment(); 
     default: 
      return new ComingSoonFragment(); 
     } 
    } 


    @Override 
    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
    } 


    @Override 
    public int getCount() { 
     return BrowseHomeFragment.Tab.values().length; 
    } 


    @Override 
    public CharSequence getPageTitle(int position) { 
     return BrowseHomeFragment.Tab.resolve(position).name(); 
    } 


    @Override 
    public void setPrimaryItem(ViewGroup container, int position, Object object) { 
     if (position != lastPosition) { // debounce Android's redundant calls 
      switch (BrowseHomeFragment.Tab.resolve(position)) { 
       case Categories: 
        browseHomepageMetricRecorder.recordGotoCategoriesMetric(); 
        if (!networkMonitor.isDeviceConnected()) { 
         networkMonitor.postUserActionRequiresConnectivityEvent(); 
        } 
        break; 
       case Downloaded: 
        browseHomepageMetricRecorder.recordGotoDownloadedMetric(); 
        break; 
       default: 
        break; 
      } 
      lastPosition = position; 
     } 

     super.setPrimaryItem(container, position, object); 
    } 


    public Object instantiateItem(ViewGroup container, int position) { 
     final Fragment fragment = (Fragment) super.instantiateItem(container, position); 
     registeredFragments.put(position, fragment); 
     return fragment; 
    } 


    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     registeredFragments.remove(position); 
     super.destroyItem(container, position, object); 
    } 


    public Fragment getRegisteredFragment(int position) { 
     return registeredFragments.get(position); 
    } 

Ich nehme an, dass der ViewPager etwas verliert, obwohl ich Debug ausgeführt habe und es nicht null ist.

Ich kann das beheben, indem ich einfach jedes Mal, wenn ich das aktive Fragment mit dem BrowseFragment neu erstelle, neu erstelle, aber ich würde es lieber in der Lage sein, es wiederzuverwenden.

Jede Hilfe zu verstehen, was genau passiert und wie es zu lösen wäre sehr dankbar.

+0

Bitte editieren Sie Ihre Frage und fügen Sie den fehlenden Code für 'BrowseHomePagerAdapter' hinzu – petey

+0

yeah Entschuldigung tat das tatsächlich .. Eile macht Taille – erik

Antwort

3

Nach meinem Kopf hämmern, ich habe eine Lösung gefunden zu haben .. In meinem Adapter ich jetzt die onRestoreState zwingend nichts zu tun ..

@Override 
public void restoreState(Parcelable state, ClassLoader loader) { 
    //Do NOTHING; 
} 

Ich bin nicht sicher, ob dies die beste Lösung ist, doesn‘ Es scheint, als hätten sie schlechte Auswirkungen, und wenn jemand mit diesem "Fix" sprechen könnte und warum es funktioniert oder eine bessere Lösung bietet, würde es sehr geschätzt werden.

+0

Vielen Dank! War genau das, was ich für verschachtelte Fragmente in ViewPager benötigte. – karenms