L'application se bloque lors de la tentative d'utilisation de RecyclerView sur Android 5.0


91

J'essaie de jouer avec le nouveau RecyclerView et chaque fois que j'essaie de l'exécuter, mon application se bloque immédiatement. Cela me donne NullPointerException pour essayer d'accéder aux méthodes à partir de android.support.v7.widget.RecyclerView. J'ai regardé d'autres articles et j'ai vu que la plupart des gens ne l'avaient pas fait, compile 'com.android.support:recyclerview-v7:+'mais j'ai essayé et cela n'a pas du tout aidé. Je ne sais pas vraiment quoi faire à ce stade, toute aide serait appréciée. Voici le journal des erreurs: (je publierais une photo mais je n'ai pas encore 10 rep)

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView$LayoutManager.onMeasure(android.support.v7.widget.RecyclerView$Recycler, android.support.v7.widget.RecyclerView$State, int, int)' on a null object reference
        at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:1764)
        at android.view.View.measure(View.java:17430)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17430)
        at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:851)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5786)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
        at android.view.Choreographer.doCallbacks(Choreographer.java:580)
        at android.view.Choreographer.doFrame(Choreographer.java:550)
        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:898)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)

pour tous ceux qui ont cette erreur causée par les onglets Viewpager, voir cette solution
Hassan Gilak

Avez-vous résolu ce problème? .S'il vous plaît aider Je rencontre le même problème
Sagar

N'oubliez pas de définir / créer / enregistrer dans onCreateViewce que vous supprimez / détruisez / désinscrivez-vous onDestroyView... Je dois suivre ces cycles de vie!
Sakiboy

Réponses:


211

Ce problème se produit généralement lorsque aucun n'a LayoutManagerété fourni pour le RecyclerView. Vous pouvez le faire comme ceci:

final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);

14
Je ne pense pas que cela doive être définitif, donc je ne pense pas que ce soit le problème. Dans mon cas, j'implémentais un fragment avec recyclerView et j'ai simplement essayé de conserver une référence à celui-ci depuis onCreateView et de définir un layoutManager plus tard lorsque les données sont chargées. J'ai eu ce problème et il a disparu lorsque j'ai défini le layoutManager plus tôt dans la méthode gamein onCreateView.
Nemanja Kovacevic

3
@ NemanjaKovačević eh bien, je suppose que chaque variable qui n'a pas besoin d'être modifiée plus tard doit être déclarée comme final, c'est pourquoi je l'ai déclarée finalici.
aga

2
Puisque LinearLayoutManager est vertical par défaut, vous pouvez utiliser: recyclerView.setLayoutManager (new LinearLayoutManager (contexte));
ll

1
Remerciez Dieu que nous puissions Google les mêmes messages d'erreur que Google pour leur donner un sens.
jhegedus

1
@wesleyfranks il est difficile de dire pourquoi vous obtenez une référence d'objet nulle sans regarder 1. le code qui définit le RecyclerView et 2. le stacktrace que vous obtenez après le crash. :)
aga

26

Dans mon cas, il n'était pas lié à «final», mais au problème mentionné dans le commentaire de @ NemanjaKovačević à @aga answer. Je définissais un layoutManager sur le chargement des données et c'était la cause du même crash. Après avoir déplacé la configuration de layoutManager vers onCreateView de mon fragment, le problème a été résolu.

Quelque chose comme ça:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
{
...
mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler);

mLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(mLayoutManager);

1
Encore une fois: je ne dis pas que ce problème est en quelque sorte lié au fait que la variable n'est pas définitive. Le problème est que cela LayoutManager n'a pas été fourni , c'est tout. Vous pouvez rendre la variable pointant vers LayoutManagerfinal, ou non final - cela ne change rien.
aga

@Yurik j'utilise recyclerview dans Activity not on fragment. quel est le cas pour moi?
Youri

@Youri, vous devriez simplement placer la configuration de layoutManager dans le onCreate de votre activité, je pense.
YuriK

10

Pour moi, j'avais le même problème, le problème était qu'il y avait un RecyclerView inutilisé dans xml avec vue disparue, mais je ne le lie à aucun adaptateur dans Activity, d'où le problème. Il a été résolu dès que j'ai supprimé ces vues de recycleur inutilisées au format XML

c'est-à-dire - j'ai supprimé cette vue car elle n'a pas été appelée dans le code ou un adaptateur a été défini

<android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/rv_profileview_allactivities"
        android:visibility="gone" />

Même chose ici, tout était parfait, mais cela ne fonctionnait pas. J'ai donc supprimé les recyclerviews inutilisées et cela a fonctionné sans aucun problème. Thanks man @Maurice ^^
Bhupinder

1
après avoir perdu une journée, j'ai essayé votre solution et cela a fonctionné: D [:( mon temps a été gaspillé]
mfaisalhyder

8

J'ai vécu ce crash même si j'avais le RecyclerView.LayoutManagerréglage correctement. J'ai dû déplacer le RecyclerView code d'initialisation dans le onViewCreated(...)rappel pour résoudre ce problème.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_listing, container, false);
    rootView.setTag(TAG);
    return inflater.inflate(R.layout.fragment_listing, container, false);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    mLayoutManager = new LinearLayoutManager(getActivity());
    mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

    mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());
    mRecyclerView.setLayoutManager(mLayoutManager);

    mAdapter = new ListingAdapter(mListing);
    mRecyclerView.setAdapter(mAdapter);
}

2
Pourtant, mon problème n'est pas résolu: / J'ai essayé presque toutes les solutions et j'obtiens toujours la même erreur lors de l'utilisation de RecyclerView dans un fragment à afficher dans PagerView :(
mfaisalhyder

Impressionnant! Déplacement du RecyclerViewcode d'initialisation dans le onViewCreated(...) travail
Marcelo Gracietti

J'ai fait cette solution, et c'était toujours nul pour moi. J'essaie toujours de savoir où.
wesley franks

5

Vous devez utiliser setLayoutManagerdans la RecyclerView#onCreate()méthode. Avant d'ajouter recyclerViewà une vue, elle doit avoir l' LayoutManagerensemble.

 private RecyclerView menuAsList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    menuAsList = (RecyclerView) findViewById(R.id.recyclerView_mainMenu);
    menuAsList.setLayoutManager(new LinearLayoutManager(Home.this));

}

3

J'ai eu ce problème en raison d'une mauvaise référence d' RecyclerViewid.

recyclerView = (RecyclerView) findViewById(R.id.rv_followers_list);

à

recyclerView = (RecyclerView) findViewById(R.id.rv_search_list);

2
recyclerView =
            (RecyclerView) findViewById(R.id.recycler_view2);

Vérifiez avec votre identifiant de vue du recycleur, en indiquant la vue réelle du recycleur, a résolu mon problème


1

Mon problème était dans mon XML lyout J'ai un android: animateLayoutChanges défini sur true et j'ai appelé notifyDataSetChanged () sur l'adaptateur de RecyclerView dans le code Java.

Donc, je viens de supprimer android: animateLayoutChanges de ma mise en page et cela a résolu mon problème.


1

J'ai eu ce problème lors de l'utilisation de la bibliothèque Butterknife. J'ai eu:

View rootView = inflater.inflate
                (R.layout.fragment_recipe_detail_view, container, false);
ButterKnife.bind(rootView);

Mais la bonne version est:

View rootView = inflater.inflate
                (R.layout.fragment_recipe_detail_view, container, false);
ButterKnife.bind(this, rootView);

1

Dans Gradle, implémentez cette bibliothèque:

implementation 'com.android.support:appcompat-v7:SDK_VER'
implementation 'com.android.support:design:SDK_VER'
implementation 'com.android.support:support-v4:SDK_VER'
implementation 'com.android.support:support-v13:SDK_VER'
implementation 'com.android.support:recyclerview-v7:SDK_VER'

En XML, mentionnez comme ceci:

<android.support.v7.widget.RecyclerView
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:id="@+id/recyclerView"/>

Dans Fragment, nous utilisons recyclerViewcomme ceci:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
       View rootView = inflater.inflate(R.layout.YOUR_LAYOUT_NAME, container, false);

       RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(layoutManager);
        APICallMethod();
        YOURADAPTER = new YOURADAPTER(getActivity(), YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
        recyclerView.setAdapter(YOURADAPTER);
        return rootView;
    }

Dans l' activité, nous utilisons RecyclerViewcomme ceci:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.YOUR_LAYOUT_NAME);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(layoutManager);
        APICallMethod();
        YOURADAPTER = new YOURADAPTER(ACTIVITY_NAME.this, YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
        recyclerView.setAdapter(YOURADAPTER);
   }

si vous avez besoin de l' horizontale, RecyclerView procédez comme suit:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(layoutManager);
        APICallMethod();
        YOURADAPTER = new YOURADAPTER(ACTIVITY_NAME.this, YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
        recyclerView.setAdapter(YOURADAPTER);

si vous souhaitez utiliser GridLayoutManager en utilisant une RecyclerViewutilisation comme celle-ci:

        RecyclerView recyclerView = findViewById(R.id.rvNumbers);
        recyclerView.setLayoutManager(new GridLayoutManager(this, 3)); // 3 is number of columns.
        adapter = new MyRecyclerViewAdapter(this, data);
        recyclerView.setAdapter(adapter);

1

J'utilisais une injection de dépendance - ButterKnife et ce problème est survenu parce que je n'avais pas lié la vue.

Donc, dans onCreate (), je viens d'insérer cette ligne:

ButterKnife.bind(this);

Ma déclaration RecyclerView avec injection de dépendances:

@BindView(R.id.recyclerview)
RecyclerView recyclerView;

1

Pour ceux qui utilisent: implémentation 'androidx.recyclerview: recyclerview: 1.1.0-beta05'

assurez-vous que vous l'utilisez dans votre mise en page xml

J'ai également rencontré un plantage lors de l'exécution de mon application sous l'API 27. Voici un lien vers le message

À l'origine, j'ai créé un style pour changer la taille de la police de ma vue de texte dans la vue de recyclage, c'est pourquoi j'ai créé ce code ci-dessous: (j'aurais pu simplement appeler @dimen lors du changement de la taille de la police en fonction de la taille de l'écran)

À l'intérieur style.xml

et ajouté ceci dans mon thème

themes.xml

Après avoir enquêté, j'ai découvert que c'était celui qui me causait une erreur et après avoir supprimé le style, je ne rencontrais plus de plantage.

J'ai essayé toutes les solutions possibles que j'ai trouvées ici en cas de débordement de pile et j'ai presque abandonné cela, heureusement dans ma curiosité, j'ai pensé pourquoi ne pas supprimer le style peut-être que cela provoque le crash, puis le crash est parti.


1
Veuillez inclure des exemples de code directement plutôt que des liens vers des images. Jetez un œil à la section «Aidez les autres à reproduire le problème»: stackoverflow.com/help/how-to-ask
Chris B

1
Je suis vraiment pour ça @ChrisB. C'est la première fois que je mets un commentaire ici car ma réputation est trop basse comme vous pouvez le voir. J'ai rencontré le crash aujourd'hui et je pensais poster ici car il y a peut-être des gens qui sont également confrontés à cela, en particulier ils utilisent 'androidx.recyclerview: recyclerview: 1.1.0-beta05'.
Jeanne vie

0

Puisque LinearLayoutManager est vertical par défaut, un moyen plus simple de le faire est:

recyclerView.setLayoutManager(new LinearLayoutManager(context));

Si vous souhaitez modifier l'orientation, vous pouvez utiliser ce constructeur:

public LinearLayoutManager(Context context, int orientation, boolean reverseLayout);

avoir un gestionnaire de mise en page bizarre maintenant. im instanciant mais en ge toujours cette erreur. vache sacrée.
filthy_wizard

0

Je pense que le problème dans votre Adapter. Assurez - vous que vous êtes revenu ViewHolderen onCreateViewHolder(). Comme ci-dessous:

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v;
    v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_leaderboard, parent, false);
    ViewHolder view_holder = new ViewHolder(v);
    return view_holder;
}

0

Pour moi, le problème était avec mon activity_main.xml (21) dans lequel le recycleView n'avait pas d'identifiant.

activity_main.xml (21)

 <android.support.v7.widget.RecyclerView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginRight="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/button3"
    tools:listitem="@layout/transaction_list_row" />

activity_main.xml

<android.support.v7.widget.RecyclerView

    android:id="@+id/transac_recycler_view"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginRight="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/button3"
    />

Cela a fonctionné lorsque j'ai ajouté un android: id = "@ + id / transac_recycler_view" à activity_main.xml (21) recycleView


0

Dans mon cas, j'ai ajouté uniquement la bibliothèque Butterknife et j'ai oublié d'ajouter annotationProcessor. En ajoutant la ligne ci-dessous à build.gradle (module App), j'ai résolu mon problème.

    annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'

0

Recyclerview recylerview = findbyid (R.id.recyclerview) Peut-être que vous l'avez manqué


Salut, bienvenue à SO! Veuillez expliquer pourquoi cela est pertinent pour cette question. Tel qu'il est actuellement rédigé, il est difficile de dire à quoi vous faites référence.
Piotr Kamoda

0

J'ai eu un problème similaire lorsque j'ai testé mon application sur GenyMotion. Après le redémarrage, le problème de l'appareil dans GenyMotion a été résolu


0

J'ai rencontré le même problème car j'avais le RecyclerView dans une autre mise en page et non sur activity_main.xml.

En cherchant sur certains sites, j'ai obtenu quelque chose et j'ai eu envie de partager ici

  1. Ajouter un identifiant pour inclure la balise dans Activity_main.xml

    <include id="includedRecyclerLayout" .... </include>

  2. appelez cette mise en page avant de rechercher la vue par ID dans MainActivity.java

    `ConstraintLayout includedLayout = findViewById (R.id.inckudedRecyclerLayout);

    RecyclerViewrecyclerview = includedLayout.findViewById (R.id.RECYCLER_VIEW_ID) `;


-1

Si je suis où vous je le ferai. onView (withId (android.R.id.list)). perform (RecyclerViewActions.scrollToPosition (3)); android.R.id.list changez-le en l'identifiant de votre liste et la position sera votre position dans votre tableau.


-1

en utilisant un fragment

écriture de code dans onCreateView ()

RecyclerView recyVideo = view.findViewById (R.id.recyVideoFag);

utilisation de l'activité

écriture de code dans onCreate () RecyclerView recyVideo = findViewById (R.id.recyVideoFag);

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.