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.
Bitte editieren Sie Ihre Frage und fügen Sie den fehlenden Code für 'BrowseHomePagerAdapter' hinzu – petey
yeah Entschuldigung tat das tatsächlich .. Eile macht Taille – erik