web-dev-qa-db-fra.com

L'application se bloque lorsque vous essayez d'utiliser RecyclerView sur Android 5.0

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 avoir essayé d'accéder aux méthodes à partir de Android.support.v7.widget.RecyclerView. J'ai consulté d'autres publications et j'ai constaté que la plupart des gens n'avaient pas compile 'com.Android.support:recyclerview-v7:+', mais j'ai essayé, mais cela ne m'a pas aidé. Pas vraiment sûr de savoir quoi faire à ce stade, toute aide serait la bienvenue. Voici le journal des erreurs: (je posterais 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)
89
Joe

Ce problème se produit généralement lorsqu'aucune LayoutManager n'a été fournie pour RecyclerView . Vous pouvez le faire comme ça: 

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

Dans mon cas, il n'était pas connecté à «final», mais au problème mentionné dans le commentaire de @ NemanjaKovačević à @aga answer . 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);
26
YuriK

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

c'est-à-dire que j'ai supprimé cette vue car elle n'a pas été appelée dans le code ou aucun adaptateur n'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" />
10
Maurice

J'ai rencontré ce crash même si le RecyclerView.LayoutManager était correctement défini. J'ai dû déplacer le code d'initialisation RecyclerView dans le rappel onViewCreated(...) 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);
}
8
Shirish Kamath

Vous devez utiliser setLayoutManager dans la méthode RecyclerView#onCreate(). Avant d’ajouter recyclerView à une vue, l’ensemble LayoutManager doit être défini.

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

}
4
katwal-Dipak
recyclerView =
            (RecyclerView) findViewById(R.id.recycler_view2);

Vérifiez avec votre ID de vue du recycleur, en pointant sur la vue réelle du recycleur, le problème a été résolu.

2
iam_muqshid

Mon problème était dans mon lyout XML j'ai un Android: animateLayoutChanges mis à 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é-aimé mon problème.

1
Ahlem Jarrar

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

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

à

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

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
Pooja

Je pense que le problème dans votre Adapter. Assurez-vous d’avoir retourné ViewHolder dans onCreateViewHolder().

@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
Hardik Lakhani

J'ai eu ce problème en utilisant la bibliothèque Butterknife . J'avais:

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

Mais la version correcte est:

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

J'utilisais une Dependency Injection - ButterKnife et ce problème s'est posé car je n'avais pas lié la vue.

Donc à l'intérieur onCreate () je viens d'insérer cette ligne:

ButterKnife.bind(this);

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

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

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

0
Sadique Khan

Dans Gradle implémenter 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'

DansXMLmentionnez 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 recyclerView comme 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 Activity nous utilisons RecyclerView comme 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 horizontal 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 voulez utiliser GridLayoutManager en utilisant RecyclerView, utilisez comme ceci:

        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);
0
Abhinav Gupta

Pour moi, le problème venait de mon activité_main.xml (21) dans laquelle 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 fonctionnait quand j'ai ajouté un Android: id = "@ + id/transac_recycler_view" à activity_main.xml (21) recycleView

0
DAVID KATHOH