App stürzt ab, wenn versucht wird, RecyclerView unter Android 5.0 zu verwenden


90

Ich versuche, mich mit dem neuen RecyclerView herumzuschlagen, und wenn ich versuche, es auszuführen, stürzt meine App sofort ab. Es gibt mir NullPointerException für den Versuch, auf Methoden von zuzugreifen android.support.v7.widget.RecyclerView. Ich habe mir andere Beiträge angesehen und festgestellt compile 'com.android.support:recyclerview-v7:+', dass die meisten Leute keine hatten, aber ich habe das versucht und es hat überhaupt nicht geholfen. Ich bin mir nicht sicher, was ich zu diesem Zeitpunkt tun soll. Ich würde mich über jede Hilfe freuen. Hier das Fehlerprotokoll: (Ich würde ein Bild posten, aber ich habe noch keine 10 Wiederholungen)

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)

Für alle, die diesen Fehler durch Viewpager-Registerkarten verursacht haben, siehe diese Lösung
Hassan Gilak

Haben Sie das gelöst? Bitte helfen Sie mir, ich habe das gleiche Problem
Sagar

Denken Sie daran, festzulegen, zu erstellen / zu registrieren, onCreateViewwas Sie entfernen / zerstören / abmelden onDestroyView... Muss diesen Lebenszyklen folgen!
Sakiboy

Antworten:


211

Dieses Problem tritt normalerweise auf, wenn LayoutManagerfür das keine angegeben wurde RecyclerView. Sie können es so machen:

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

14
Ich denke nicht, dass es endgültig sein muss, also denke ich nicht, dass das das Problem war. In meinem Fall habe ich ein Fragment mit recyclerView implementiert und versucht, nur einen Verweis von onCreateView darauf beizubehalten und später beim Laden der Daten einen layoutManager festzulegen. Ich hatte dieses Problem und es verschwand, als ich den layoutManager früher in der gamein onCreateView-Methode festgelegt habe.
Nemanja Kovacevic

3
@ NemanjaKovačević Nun, ich nehme an, dass jede Variable, die später nicht geändert werden muss, als deklariert werden finalmuss. Deshalb habe ich sie finalhier deklariert .
Aga

2
Da LinearLayoutManager standardmäßig vertikal ist, können Sie Folgendes verwenden: recyclerView.setLayoutManager (neuer LinearLayoutManager (Kontext));
ll

1
Gott sei Dank, dass wir dieselben Fehlermeldungen von Google googeln können, die von Google erstellt wurden, um daraus einen Sinn zu machen.
Jhegedus

1
@wesleyfranks Es ist schwer zu sagen, warum Sie eine Null-Objektreferenz erhalten, ohne 1. den Code zu betrachten, mit dem RecyclerView eingerichtet wird, und 2. den Stacktrace, den Sie nach dem Absturz erhalten. :)
aga

26

In meinem Fall war es nicht mit 'final' verbunden, sondern mit dem in @ NemanjaKovačević Kommentar zu @aga Antwort erwähnten Problem. Ich habe beim Laden der Daten einen layoutManager eingerichtet, und das war die Ursache für denselben Absturz. Nach dem Verschieben des layoutManager-Setups nach onCreateView meines Fragments wurde das Problem behoben.

Etwas wie das:

@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
Noch einmal: Ich sage nicht, dass dieses Problem irgendwie damit zusammenhängt, dass die Variable nicht endgültig ist. Das Problem ist, dass LayoutManager nicht zur Verfügung gestellt wurde , das war's. Sie können festlegen, dass die Variable auf LayoutManagerfinal oder nicht final zeigt - sie ändert nichts.
Aga

@Yurik Ich verwende Recyclerview in Aktivität nicht auf Fragment. Was ist der Fall für mich?
Youri

@Youri Sie sollten einfach layoutManager Setup in das onCreate Ihrer Aktivität einfügen, denke ich.
YuriK

10

Für mich hatte ich das gleiche Problem. Das Problem war, dass es eine nicht verwendete RecyclerView in XML gab, deren Ansicht weg war, aber ich binde sie nicht an einen Adapter in Activity, daher das Problem. Es wurde gelöst, sobald ich solche nicht verwendeten Recycler-Ansichten in XML entfernt hatte

dh - Ich habe diese Ansicht entfernt, da dies nicht im Code aufgerufen wurde oder ein Adapter festgelegt wurde

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

Hier war alles perfekt, aber es hat nicht funktioniert. Also habe ich nicht verwendete Recycling-Ansichten entfernt und es hat ohne Probleme funktioniert. Danke Mann @Maurice ^^
Bhupinder

1
Nachdem ich einen Tag verschwendet hatte, versuchte ich Ihre Lösung und es funktionierte: D [:( meine Zeit wurde verschwendet]
mfaisalhyder

8

Ich habe diesen Absturz erlebt, obwohl ich das RecyclerView.LayoutManagerrichtig eingestellt hatte. Ich musste den RecyclerView Initialisierungscode in den onViewCreated(...)Rückruf verschieben, um dieses Problem zu beheben.

@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
Trotzdem ist mein Problem nicht behoben: / Ich habe fast jede Lösung ausprobiert und immer noch den gleichen Fehler erhalten, wenn ich RecyclerView in einem Fragment verwende, das in PagerView angezeigt werden soll :(
mfaisalhyder

Genial! Verschieben des RecyclerViewInitialisierungscodes in den onViewCreated(...) bearbeiteten
Marcelo Gracietti

Ich habe diese Lösung gemacht und sie war für mich immer noch null. Ich versuche immer noch herauszufinden, wo.
Wesley Franks

5

Sie müssen setLayoutManagerin der RecyclerView#onCreate()Methode verwenden. Vor dem Hinzufügen recyclerViewzu einer Ansicht muss das LayoutManagerSet vorhanden sein.

 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

Ich habe dieses Problem aufgrund einer falschen RecyclerViewID- Referenz erhalten .

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

zu

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

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

Wenden Sie sich an Ihre ID für die Recycler-Ansicht. Wenn Sie auf die tatsächliche Recycler-Ansicht verweisen, wurde mein Problem behoben


1

Mein Problem war in meinem XML-Lyout. Ich habe ein Android: animateLayoutChanges auf true gesetzt und notifyDataSetChanged () auf dem RecyclerView-Adapter im Java-Code aufgerufen.

Also habe ich gerade android: animateLayoutChanges aus meinem Layout entfernt und das hat mein Problem behoben.


1

Ich hatte dieses Problem bei der Verwendung der Butterknife-Bibliothek. Ich hatte:

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

Aber die richtige Version ist:

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

1

In Gradle implementieren Sie diese Bibliothek:

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'

Erwähnen Sie in XML Folgendes:

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

In Fragment verwenden wir Folgendes recyclerView:

@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;
    }

In Aktivität verwenden wir Folgendes RecyclerView:

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

Wenn Sie horizontal benötigen, RecyclerViewgehen Sie wie folgt vor :

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

Wenn Sie GridLayoutManagerRecyclerView wie folgt verwenden möchten :

        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

Ich habe eine Abhängigkeitsinjektion - ButterKnife verwendet, und dieses Problem trat auf, weil ich die Ansicht nicht gebunden hatte.

Also habe ich in onCreate () gerade diese Zeile eingefügt:

ButterKnife.bind(this);

Meine RecyclerView-Deklaration mit Abhängigkeitsinjektion:

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

1

Für diejenigen, die Folgendes verwenden: Implementierung 'androidx.recyclerview: recyclerview: 1.1.0-beta05'

Stellen Sie sicher, dass Sie dies in Ihrem XML-Layout verwenden

Beim Ausführen meiner App unter API 27 ist ebenfalls ein Absturz aufgetreten. Hier ist ein Link zur Nachricht

Ursprünglich habe ich einen Stil erstellt, um die Schriftgröße meiner Textansicht in der Recyclingansicht zu ändern. Deshalb habe ich den folgenden Code erstellt: (Ich hätte einfach @dimen aufrufen können, wenn ich die Schriftgröße basierend auf den Bildschirmgrößen geändert hätte.)

Innerhalb von style.xml

und fügte dies in meinem Thema

theme.xml

Nach einer Untersuchung stellte ich fest, dass dies derjenige ist, der mir einen Fehler verursacht, und nachdem ich den Stil entfernt hatte, trat kein Absturz mehr auf.

Ich habe alle möglichen Lösungen ausprobiert, die ich hier im Stapelüberlauf gefunden habe, und habe dies fast aufgegeben. Zum Glück dachte ich in meiner Neugier, warum ich den Stil nicht entfernen sollte, vielleicht verursacht dies den Absturz und dann boomt der Absturz ist weg.


1
Bitte fügen Sie Codebeispiele direkt hinzu, anstatt auf Bilder zu verlinken. Werfen
Chris B

1
Ich bin wirklich für dieses @ChrisB. Ich schreibe hier zum ersten Mal einen Kommentar, da mein Ruf zu niedrig ist, wie Sie sehen können. Ich bin heute auf den Absturz gestoßen und habe darüber nachgedacht, hier etwas zu posten, da es vielleicht auch Leute gibt, die damit konfrontiert sind, insbesondere wenn sie 'androidx.recyclerview: recyclerview: 1.1.0-beta05' verwenden.
Jeanne vie

0

Da LinearLayoutManager standardmäßig vertikal ist, ist dies einfacher:

recyclerView.setLayoutManager(new LinearLayoutManager(context));

Wenn Sie die Ausrichtung ändern möchten, können Sie diesen Konstruktor verwenden:

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

Ich habe jetzt einen seltsamen Issulinearlayout-Manager. Ich instanziiere es, aber in immer noch ge diesen Fehler. Heiliger Bimbam.
filthy_wizard

0

Ich denke das Problem liegt in deinem Adapter. Stellen Sie sicher , Sie sind zurückgekehrt ViewHolderin onCreateViewHolder(). Wie unten:

@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

Für mich war das Problem mit meiner activity_main.xml (21), in der die recycleView keine ID hatte.

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"
    />

Es hat funktioniert, als ich ein Android hinzugefügt habe: id = "@ + id / transac_recycler_view" zur activity_main.xml (21) recycleView


0

In meinem Fall habe ich nur die Butterknife-Bibliothek hinzugefügt und vergessen, annotationProcessor hinzuzufügen. Durch Hinzufügen der folgenden Zeile zu build.gradle (App-Modul) wurde mein Problem gelöst.

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

0

Recyclerview recylerview = findbyid (R.id.recyclerview) Möglicherweise haben Sie es verpasst


Hallo, willkommen bei SO! Bitte erläutern Sie, warum dies für diese Frage relevant ist. Wie es gerade geschrieben wird, ist es schwer zu sagen, worauf Sie sich beziehen.
Piotr Kamoda

0

Ich hatte ein ähnliches Problem, als ich meine Anwendung auf GenyMotion testete. Nach dem Neustart wurde das Gerät in GenyMotion Problem behoben


0

Ich hatte das gleiche Problem, weil ich die RecyclerView in einem anderen Layout und nicht in activity_main.xml hatte.

Durch die Suche auf einigen Websites habe ich etwas bekommen und wollte hier teilen

  1. ID hinzufügen, um Tag in Activity_main.xml einzuschließen

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

  2. Rufen Sie dieses Layout auf, bevor Sie die Ansicht nach ID in MainActivity.java durchsuchen

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

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


-1

Wenn ich wo du bist, werde ich das tun. onView (withId (android.R.id.list)). perform (RecyclerViewActions.scrollToPosition (3)); android.R.id.list Ändern Sie es in Ihre Listen-ID und Position wird Ihre Position innerhalb Ihres Arrays sein.


-1

mit Fragment

Schreiben von Code in onCreateView ()

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

mit Aktivität

Schreiben von Code in onCreate () RecyclerView recyVideo = findViewById (R.id.recyVideoFag);

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.