Awaria aplikacji podczas próby użycia RecyclerView w systemie Android 5.0


91

Próbuję zepsuć nowy RecyclerView i za każdym razem, gdy próbuję go uruchomić, moja aplikacja natychmiast się zawiesza. Daje mi NullPointerException dla próby uzyskania dostępu do metod z android.support.v7.widget.RecyclerView. Przejrzałem inne posty i zobaczyłem, że większość ludzi nie ma, compile 'com.android.support:recyclerview-v7:+'ale próbowałem tego i to w ogóle nie pomogło. Nie bardzo wiem, co robić w tym momencie, każda pomoc będzie mile widziana. Tutaj dziennik błędów: (opublikowałbym zdjęcie, ale nie mam jeszcze 10 powtórzeń)

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)

dla każdego, kto ma ten błąd spowodowany zakładkami Viewpager, zobacz to rozwiązanie
Hassan Gilak

Czy rozwiązałeś ten problem? Proszę o pomoc Mam ten sam problem
Sagar

Pamiętaj, aby ustawić / utworzyć / zarejestrować onCreateViewto, co usuwasz / niszczysz / wyrejestrowujesz onDestroyView... Musisz przestrzegać tych cykli życia!
Sakiboy

Odpowiedzi:


211

Ten problem zwykle występuje, gdy nie LayoutManagerpodano RecyclerView. Możesz to zrobić tak:

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

14
Nie sądzę, żeby to było ostateczne, więc nie sądzę, że w tym problem. W moim przypadku implementowałem fragment z recyklerView i próbowałem po prostu zachować odniesienie do niego z onCreateView i ustawić layoutManager później, gdy dane są ładowane. Miałem ten problem i zniknął, kiedy ustawiłem layoutManager wcześniej w metodzie gamein onCreateView.
Nemanja Kovacevic

3
@ NemanjaKovačević cóż, przypuszczam, że każda zmienna, której nie trzeba później zmieniać, musi być zadeklarowana jako final, dlatego zadeklarowałem ją finaltutaj.
aga

2
Ponieważ LinearLayoutManager jest domyślnie pionowy, można użyć: recyclinglerView.setLayoutManager (nowy LinearLayoutManager (kontekst));
ll

1
Dzięki Bogu, że możemy wygooglować te same komunikaty o błędach, które są tworzone przez Google, aby nadać im sens.
jhegedus,

1
@wesleyfranks Trudno powiedzieć, dlaczego otrzymujesz odwołanie do obiektu o wartości null bez patrzenia na 1. kod, który ustawia RecyclerView w górę i 2. śledzenie stosu, które otrzymujesz po awarii. :)
aga

26

W moim przypadku nie było to związane z „finałem”, ale z kwestią poruszoną w komentarzu @ NemanjaKovačević do odpowiedzi @aga. Ustawiałem layoutManager na ładowanie danych i to było przyczyną tej samej awarii. Po przeniesieniu konfiguracji layoutManagera do onCreateView mojego fragmentu problem został rozwiązany.

Coś takiego:

@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
Jeszcze raz: nie mówię, że ten problem jest w jakiś sposób związany z tym, że zmienna nie jest ostateczna. Problem w tym, że LayoutManager to nie zostało dostarczone , to wszystko. Możesz sprawić, by zmienna wskazywała na LayoutManagerfinal lub nie na final - to niczego nie zmienia.
aga

@Yurik używam recyclinglerview w działaniu, a nie na fragmencie. co ze mną?
Youri

@Youri, myślę, że powinieneś po prostu umieścić konfigurację layoutManagera w onCreate swojej aktywności.
YuriK

10

W moim przypadku miałem ten sam problem, problem polegał na tym, że w xml był nieużywany RecyclerView z widokiem, ale nie wiążę go z żadnym adapterem w Aktywności, stąd problem. Zostało rozwiązane, gdy tylko usunąłem takie nieużywane widoki recyklera w formacie xml

tj. - usunąłem ten widok, ponieważ nie został on wywołany w kodzie lub został ustawiony żaden adapter

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

To samo tutaj wszystko było idealne, ale nie działało. Usunąłem więc nieużywane widoki recyklingowe i działało bez problemu. Dzięki stary @ Maurice ^^
Bhupinder

1
po zmarnowaniu dnia wypróbowałem twoje rozwiązanie i zadziałało: D [:( mój czas się zmarnował]
mfaisalhyder

8

Doświadczyłem tej katastrofy, mimo że miałem RecyclerView.LayoutManagerodpowiednio ustawione. Musiałem przenieść RecyclerView kod inicjalizacji do onViewCreated(...)wywołania zwrotnego, aby naprawić ten problem.

@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
Mimo to mój problem nie został rozwiązany: / Próbowałem prawie każdego rozwiązania i nadal otrzymuję ten sam błąd podczas używania RecyclerView wewnątrz fragmentu, który ma być wyświetlany w PagerView :(
mfaisalhyder

Niesamowite! Przenoszenie RecyclerViewkodu inicjalizacyjnego do onViewCreated(...) działającego
Marcelo Gracietti

Zrobiłem to rozwiązanie i nadal było dla mnie zerowe. Wciąż próbuję dowiedzieć się, gdzie.
Wesley Franks

5

Musisz użyć setLayoutManagerw RecyclerView#onCreate()metodzie. Przed dodaniem recyclerViewdo widoku musi mieć LayoutManagerzestaw.

 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

Mam ten problem z powodu złego odniesienia do RecyclerViewid.

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

do

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

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

Skontaktuj się z identyfikatorem widoku recyklera, wskazując, że rzeczywisty widok recyklera rozwiązał mój problem


1

Mój problem był w moim lyout XML. Mam androida: animateLayoutChanges ustawiony na true i wywołałem notifyDataSetChanged () na adapterze RecyclerView w kodzie Java.

Właśnie usunąłem android: animateLayoutChanges z mojego układu i to rozwiązało mój problem.


1

Miałem ten problem podczas korzystania z biblioteki Butterknife. Miałem:

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

Ale poprawna wersja to:

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

1

W Gradle zaimplementuj tę bibliotekę:

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'

W XML wspomnieć o tym:

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

We fragmencie używamy w recyclerViewten sposób:

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

W Aktywności używamy w RecyclerViewnastępujący sposób:

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

jeśli potrzebujesz w poziomie, RecyclerView zrób to:

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

jeśli chcesz używać GridLayoutManager używając RecyclerViewtego:

        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

I był przy użyciu iniekcji zależność - butterknife i ten problem arised bo nie zbindowanych pogląd.

Więc wewnątrz onCreate () właśnie wstawiłem ten wiersz:

ButterKnife.bind(this);

Moja deklaracja RecyclerView z iniekcją zależności:

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

1

Dla tych, którzy używają: implementacja „androidx.recyclerview: recyclinglerview: 1.1.0-beta05”

upewnij się, że używasz tego w swoim układzie XML

Wystąpiła również awaria podczas uruchamiania mojej aplikacji poniżej API 27. Oto łącze do wiadomości

Pierwotnie stworzyłem styl, aby zmienić rozmiar czcionki mojego widoku tekstu w widoku recyklingu, dlatego utworzyłem poniższy kod: (mogłem po prostu nazwać @dimen podczas zmiany rozmiaru czcionki na podstawie rozmiarów ekranu)

Wewnątrz style.xml

i dodałem to w moim motywie

motywy.xml

Po zbadaniu okazało się, że to on powoduje błąd i po usunięciu stylu nie mam już awarii.

Wypróbowałem wszystkie możliwe rozwiązania, które znalazłem tutaj w przepełnieniu stosu i prawie z tego zrezygnowałem, na szczęście z ciekawości pomyślałem, dlaczego nie usunąć stylu, może to powoduje awarię, a następnie bum, awaria zniknęła.


1
Prosimy o umieszczanie przykładów kodu bezpośrednio zamiast linkowania do obrazów. Zajrzyj do sekcji „Pomóż innym odtworzyć problem”: stackoverflow.com/help/how-to-ask
Chris B,

1
Jestem naprawdę za tym @ChrisB. To mój pierwszy komentarz, ponieważ moja reputacja jest zbyt niska, jak widzisz. Napotkałem dziś awarię i zastanawiałem się nad opublikowaniem tutaj, ponieważ być może są ludzie, którzy również się z tym mierzą, zwłaszcza, że ​​używają „androidx.recyclerview: recyclinglerview: 1.1.0-beta05”.
Jeanne vie

0

Ponieważ LinearLayoutManager jest domyślnie pionowy, łatwiejszym sposobem jest:

recyclerView.setLayoutManager(new LinearLayoutManager(context));

Jeśli chcesz zmienić orientację, możesz użyć tego konstruktora:

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

posiadanie teraz dziwnego menadżera gry. Im tworzę instancję, ale nadal ten błąd. święta krowa.
filthy_wizard

0

Myślę, że problem w twoim Adapter. Upewnij się, że wrócił ViewHolderw onCreateViewHolder(). Jak poniżej:

@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

Dla mnie problem był z moim activity_main.xml (21), w którym recycleView nie miał identyfikatora.

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

Zadziałało, gdy dodałem androida: id = "@ + id / transac_recycler_view" do pliku activity_main.xml (21) recycleView


0

W moim przypadku dodałem tylko bibliotekę Butterknife i zapomniałem dodać adnotacjęProcessor. Dodając poniższą linię do build.gradle (moduł aplikacji), rozwiązałem mój problem.

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

0

Recyclerview recylerview = findbyid (R.id.recyclerview) Być może przegapiłeś to


Cześć, witaj w SO! Proszę wyjaśnić więcej, dlaczego jest to istotne dla tego pytania. Jak jest obecnie napisane, trudno powiedzieć, o czym mówisz.
Piotr Kamoda

0

Miałem podobny problem, gdy testowałem swoją aplikację na GenyMotion. Po ponownym uruchomieniu urządzenia problem w GenyMotion został rozwiązany


0

Napotkałem ten sam problem, ponieważ miałem RecyclerView w innym układzie, a nie w activity_main.xml.

Szukając w niektórych witrynach, znalazłem coś i chciałem się tutaj podzielić

  1. Dodaj identyfikator, aby uwzględnić tag w Activity_main.xml

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

  2. wywołaj ten układ przed wyszukiwaniem widoku według identyfikatora w pliku MainActivity.java

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

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


0

Miałem ten problem podczas używania Butterknife, używałem fragmentu

W przypadku Fragment tak powinno być ButterKnife.bind(this,view);

Do aktywności ButterKnife.bind(this);


-1

Jeśli ja, gdzie ty, zrobię to. onView (withId (android.R.id.list)). perform (RecyclerViewActions.scrollToPosition (3)); android.R.id.list zmień to na swój identyfikator listy, a pozycja będzie Twoją pozycją w tablicy.


-1

za pomocą fragmentu

pisanie kodu w onCreateView ()

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

za pomocą aktywności

pisanie kodu w onCreate () RecyclerView recyVideo = findViewById (R.id.recyVideoFag);

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.