Pourquoi est-ce que je reçois une référence nulle sur mon RecyclerView

J'essaie d'utiliser RecyclerView dans mes fragments. Il s'affiche bien pour le premier onglet, mais lorsque je glisse vers le deuxième onglet, puis je retourne au premier, j'ai l'erreur suivante:

Java.lang.NullPointerException: Essayez d'invoquer la méthode virtuelle 'void android.support.v7.widget.RecyclerView $ LayoutManager.stopSmoothScroller ()' sur une référence d'objet nulle

  • Est-ce que quelqu'un a créé le profil de formatage de code Java pour Eclipse IDE conforme aux règles de style de code Android?
  • ? Android: attr / selecttableItemBackground
  • Traduire une image en texte sur Android?
  • Comment faire un écran de démarrage?
  • Android: Comment détecter l'orientation de l'image (portrait ou paysage) choisie dans la galerie lors de la définition d'une image?
  • Comment puis-je créer une fonction JQuery Slider-like sur l'application Web iPhone / Android?
  • Est-ce que quelqu'un sait pourquoi j'aurais cette erreur? Il semble qu'il y ait un appel que je manque avant que les fragments ne changent, mais je ne peux pas le comprendre.

    Adaptateur Pager pour les fragments:

    public class PagerAdapter extends FragmentPagerAdapter { private final String[] TITLES = {"Header 0", "Header 1" }; public PagerAdapter(FragmentManager fm){ super(fm); } @Override public CharSequence getPageTitle(int position){ return TITLES[position]; } @Override public int getCount() { return TITLES.length; } @Override public Fragment getItem(int position){ switch(position){ case 0: return new FragmentOne(); case 1: return new FragmentTwo(); default: return new FragmentOne(); } } } 

    FragmentOne & FragmentTwo utilise une classe de calque que j'ai créée:

     public class FragmentOne extends Base { ... code for displaying content in the RecyclerView. Just contains my custom Adapter for the RecyclerView ... } 

    Base:

     public abstract class Base extends Fragment { public View mView; public RecyclerView mDataView; public ProgressBar mProgressBar; public Context mContext; private RecyclerView.LayoutManager mLayoutManager; public Base() { } @Override public View onCreateView(LayoutInflater _i, ViewGroup _vg, Bundle savedInstanceBundle){ mView = _i.inflate(R.layout.f_base, null); mDataView = (RecyclerView) mView.findViewById(R.id.data); mProgressBar = (ProgressBar)mView.findViewById(R.id.loading); mLayoutManager = new LinearLayoutManager(mContext); mDataView.setLayoutManager(mLayoutManager); mContext = this.getActivity(); return mView; } @Override public void onStart() { super.onStart(); init(); doWork(); } public abstract void init(); public abstract void doWork(); } 

    MODIFIER

    Erreur Trace de pile:

     11-02 12:49:44.171 3708-3708/com.nitrox.digitune E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.nitrox.digitune, PID: 3708 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView$LayoutManager.stopSmoothScroller()' on a null object reference at android.support.v7.widget.RecyclerView.stopScrollersInternal(RecyclerView.java:1159) at android.support.v7.widget.RecyclerView.stopScroll(RecyclerView.java:1151) at android.support.v7.widget.RecyclerView.onDetachedFromWindow(RecyclerView.java:1356) at android.view.View.dispatchDetachedFromWindow(View.java:13441) at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2837) at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2834) at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2834) at android.view.ViewGroup.removeViewInternal(ViewGroup.java:4163) at android.view.ViewGroup.removeViewInternal(ViewGroup.java:4136) at android.view.ViewGroup.removeView(ViewGroup.java:4068) at android.support.v4.view.ViewPager.removeView(ViewPager.java:1326) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1045) at android.support.v4.app.FragmentManagerImpl.detachFragment(FragmentManager.java:1280) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:724) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489) at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:486) at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) at android.support.v4.view.ViewPager.populate(ViewPager.java:1073) at android.support.v4.view.ViewPager.populate(ViewPager.java:919) at android.support.v4.view.ViewPager$3.run(ViewPager.java:249) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) at android.view.Choreographer.doCallbacks(Choreographer.java:580) at android.view.Choreographer.doFrame(Choreographer.java:549) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

  • La vue Fragment dans ViewPager n'est pas restaurée lors de la reprise
  • Comment fermer un SearchView par programme?
  • Android viewdownground
  • Webviewglue nativedestroy view
  • Comment analyser json string dans Android?
  • Android: recherche d'une méthode drawArc () avec rayon intérieur et extérieur
  • 4 Solutions collect form web for “Pourquoi est-ce que je reçois une référence nulle sur mon RecyclerView”

    Fondamentalement, votre LayoutManager est éliminé avant que votre recycleur ne soit terminé.

    De la source Android:

     @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mItemAnimator != null) { mItemAnimator.endAnimations(); } mFirstLayoutComplete = false; stopScroll(); mIsAttached = false; if (mLayout != null) { mLayout.onDetachedFromWindow(this, mRecycler); } removeCallbacks(mItemAnimatorRunner); } 

    Le problème est stopScroll essaie d'appeler mLayout.stopSmoothScroller (); Sans vérifier si mLayout est nul. J'ai lancé une solution correcte pour une application sur laquelle j'ai travaillé, mais je ne devrais pas être utilisé comme une solution à long terme, car il s'agit d'un hack, mais j'ai eu un délai serré, donc j'ai juste dû prendre l'exception du pointeur nul . J'ai découvert mon manipulateur parce que c'était spécifique à l'application.

    Mon correctif était juste pour créer une vue personnalisée étendant le RecyclerView:

     import android.content.Context; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; public class HotFixRecyclerView extends RecyclerView { public HotFixRecyclerView( Context context ) { super( context ); } public HotFixRecyclerView( Context context, AttributeSet attrs ) { super( context, attrs ); } public HotFixRecyclerView( Context context, AttributeSet attrs, int defStyle ) { super( context, attrs, defStyle ); } @Override public void stopScroll() { try { super.stopScroll(); } catch( NullPointerException exception ) { /** * The mLayout has been disposed of before the * RecyclerView and this stops the application * from crashing. */ } } } 

    Ensuite, modifiez toutes les références à RecyclerView à ma propre vue. Si vous l'utilisez, retirez-le une fois que Android a corrigé ce problème car il s'agit d'un peu de piratage.

    • Dans le cas où vous utilisez recylerview sur XML, n'oubliez pas de modifier le fichier XML en fonction de com.your.package.HotFixRecyclerView au lieu d' android.support.v7.widget.RecyclerView

    Il semble que si vous avez un RecyclerView dans votre mise en page et que vous le chargez dans l'Activité, il est nécessaire de définir un LayoutManager pour cela, sinon il lancer cette Exception lors de la tentative de destruction. Je viens d'éprouver cette erreur et c'est la façon dont je l'ai résolu:

    Mon activité a montré des éléments dans une paire de TextViews ou dans un RecyclerView en fonction de la quantité d'articles: s'il s'agissait d'une collection d'éléments, j'ai utilisé RecyclerView; S'il n'y avait qu'un seul élément, il a été affiché sur TextViews et j'ai configuré la visibilité de RecyclerView à GONE .

    Ensuite, dans le premier cas, j'ai appelé myRecyclerView.setLayoutManager(myLayoutManager) , mais dans l'autre cas, je ne l'ai pas fait, car je myRecyclerView.setLayoutManager(myLayoutManager) pas l'utiliser. Dans les deux cas, l'activité contenant le RecyclerView a été affichée parfaitement. Mais lors de la fermeture, l'Exception a été lancée dans le deuxième cas, car le RecyclerView, bien que non utilisé, existait et, en essayant de le disposer, il semblait qu'il ne pouvait pas. Donc, j'ai simplement assigné le LayoutManager dans les deux cas, bien que je ne l'utilises pas, et cela a résolu le problème.

    Voici le code de mon activité:

     ItemsAdapter adapter; RecyclerView myRecyclerView = findViewById(R.id.my_recycler_view); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); if (items.size() > 1){ adapter = new ItemsAdapter(this, R.layout.item_layout, items); myRecyclerView.setLayoutManager(layoutManager); myRecyclerView.setAdapter(adapter); } else { tv_field1.setText(items.get(0).getField1()); tv_field2.setText(items,get(0).getField2()); myRecyclerView.setVisibility(View.GONE); //This is what I had to add myRecyclerView.setLayoutManager(layoutManager); } 

    En lisant le bug posté par Isaak, la meilleure solution semble assigner le Layout Manager dès que la vue est gonflée.

    Dans mon cas, je n'ai eu qu'à l'attribuer sur onCreate pour corriger le problème:

     mLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLayoutManager); 

    Parce qu'il a déjà gonflé pref.xml. Vous devez supprimer ceci:

      @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mRootView = inflater.inflate(R.layout.xxx, container, false); return mRootView; } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.