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

  • Android: déplacer les boutons librement dans Eclipse's Graphical Layout Editor
  • Android Material Play / Pause Vector Drawable Animation
  • Android Volley envoie l'information deux fois avec le téléchargement d'image
  • Appelez une méthode java statique d'un autre paquet à partir du code natif
  • Comment convertir char en jstring dans JNI?
  • ZTE V9 n'est pas détecté par la BAD
  • 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) 

  • Besoin de faire une ligne spéciale suivre le doigt de l'utilisateur en douceur qui a également d'autres comportements
  • La grande icône de la notification Android est-elle un moyen de supprimer l'icône plus petite en bas à droite?
  • La meilleure façon de communiquer un service avec une activité (diffusion, rappels, etc.)
  • Modification des icônes TabLayout à gauche, en haut, à droite ou en bas dans com.android.support:design:23.1.0
  • Où la résolution vidéo est-elle stockée dans Android?
  • Ne peut pas cliquer sur listview row avec imagebutton
  • 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.