2017-01-31 2 views
1

J'ai des fragments échangés dans et hors de mon activité principale. Le fragment initial est appelé BrowseHomeFragment et des charges bien au début, mais quand je le remplace par un nouveau fragment, puis le remplacer en arrière, je reçois l'erreur suivanteFragment ViewPager NullPointer question

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 Méthode de 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); 
    } 

Je comprends que le viewPager perd quelque chose même si j'ai lancé le déboguage et qu'il n'est pas nul ..

Je peux corriger cela en recréant simplement mon BrowseFragment chaque fois avant de remplacer le fragment actif, mais je préfère juste être capable de le réutiliser.

Toute aide pour comprendre ce qui se passe exactement et comment le résoudre serait grandement appréciée.

+0

s'il vous plaît modifier votre question et ajouter le code manquant pour 'BrowseHomePagerAdapter' – petey

+0

ouais désolé était en train de faire cela .. hâte rend la taille – erik

Répondre

3

Après avoir frappé ma tête, je l'ai trouvé une solution .. Dans mon adaptateur je PRÉPONDÉRANTS maintenant onRestoreState de ne rien faire ..

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

Je ne suis pas sûr que ce soit la meilleure solution, n » Cela semble avoir des effets néfastes, et si quelqu'un pouvait parler de cette «solution» et pourquoi cela fonctionne ou offrir une meilleure solution, il serait grandement apprécié.

+0

Merci beaucoup! Était exactement ce dont j'avais besoin pour les fragments imbriqués dans ViewPager. – karenms