2017-01-31 66 views
1

我有一些片段正在进出我的主要活动。最初的片段称为BrowseHomeFragment和负载最初很好,但是当我用新片段替换它,然后替换回来,我得到以下错误片段ViewPager空指针问题

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) 

BrowseHomeFragment的onCreateView方法:

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); 
    } 

我收集viewPager丢失的东西,虽然我已经运行调试,它不是空的..

我可以解决这个问题,只需重新创建我的BrowseFragment每次之前我用它替换活动片段,但我宁愿只是能够重用它。

任何帮助了解到底发生了什么以及如何解决它将不胜感激。

+0

请编辑您的问题,并添加缺少的代码为'BrowseHomePagerAdapter' – petey

+0

是啊对不起真的这样做..急速使腰腰部 – erik

回答

3

敲我的头,我已经找到了解决办法。在我的适配器我现在重写onRestoreState做什么..

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

我不知道这是否是最好的解决办法,没有按” t似乎有任何不好的影响,如果有人可以说这个“修复”,为什么它工作或提供更好的解决方案,将不胜感激。

+0

非常感谢!正是我在ViewPager中嵌套Fragments所需的东西。 – karenms