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)
onCreateView
to, co usuwasz / niszczysz / wyrejestrowujeszonDestroyView
... Musisz przestrzegać tych cykli życia!Odpowiedzi:
Ten problem zwykle występuje, gdy nie
LayoutManager
podanoRecyclerView
. Możesz to zrobić tak:final LinearLayoutManager layoutManager = new LinearLayoutManager(context); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(layoutManager);
źródło
final
, dlatego zadeklarowałem jąfinal
tutaj.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);
źródło
LayoutManager
to nie zostało dostarczone , to wszystko. Możesz sprawić, by zmienna wskazywała naLayoutManager
final lub nie na final - to niczego nie zmienia.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" />
źródło
Doświadczyłem tej katastrofy, mimo że miałem
RecyclerView.LayoutManager
odpowiednio ustawione. Musiałem przenieśćRecyclerView
kod inicjalizacji doonViewCreated(...)
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); }
źródło
RecyclerView
kodu inicjalizacyjnego doonViewCreated(...)
działającegoMusisz użyć
setLayoutManager
wRecyclerView#onCreate()
metodzie. Przed dodaniemrecyclerView
do widoku musi miećLayoutManager
zestaw.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)); }
źródło
Mam ten problem z powodu złego odniesienia do
RecyclerView
id.do
źródło
Skontaktuj się z identyfikatorem widoku recyklera, wskazując, że rzeczywisty widok recyklera rozwiązał mój problem
źródło
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.
źródło
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);
źródło
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
recyclerView
ten 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
RecyclerView
nastę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
RecyclerView
tego: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);
źródło
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;
źródło
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.
źródło
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);
źródło
Myślę, że problem w twoim
Adapter
. Upewnij się, że wróciłViewHolder
wonCreateViewHolder()
. 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; }
źródło
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
źródło
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'
źródło
Recyclerview recylerview = findbyid (R.id.recyclerview) Być może przegapiłeś to
źródło
Miałem podobny problem, gdy testowałem swoją aplikację na GenyMotion. Po ponownym uruchomieniu urządzenia problem w GenyMotion został rozwiązany
źródło
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ć
Dodaj identyfikator, aby uwzględnić tag w Activity_main.xml
<include id="includedRecyclerLayout" .... </include>
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) `;
źródło
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);
źródło
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.
źródło
pisanie kodu w onCreateView ()
RecyclerView recyVideo = view.findViewById (R.id.recyVideoFag);
pisanie kodu w onCreate () RecyclerView recyVideo = findViewById (R.id.recyVideoFag);
źródło