Właśnie zaimplementowano RecyclerView
w moim kodzie, zastępując ListView
.
Wszystko dziala. Dane są wyświetlane.
Ale komunikaty o błędach są rejestrowane:
15:25:53.476 E/RecyclerView: No adapter attached; skipping layout
15:25:53.655 E/RecyclerView: No adapter attached; skipping layout
dla następującego kodu:
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
Jak widać, dołączyłem adapter RecyclerView
. Dlaczego więc ciągle pojawia się ten błąd?
Przeczytałem inne pytania związane z tym samym problemem, ale żadne z nich nie pomaga.
android
android-recyclerview
recycler-adapter
equitharn
źródło
źródło
Odpowiedzi:
Czy możesz się upewnić, że wywołujesz te instrukcje z „głównego” wątku (na przykład w
onCreate()
metodzie). Jak tylko wywołam te same stwierdzenia z metody „opóźnionej”. W moim przypadku aResultCallback
dostaję tę samą wiadomość.W moim przypadku
Fragment
wywołanie poniższego kodu zResultCallback
metody powoduje wygenerowanie tego samego komunikatu. Po przeniesieniu kodu doonConnected()
metody w mojej aplikacji wiadomość zniknęła ...źródło
Otrzymywałem te same dwa komunikaty o błędach, dopóki nie naprawiłem dwóch rzeczy w kodzie:
(1) Domyślnie, gdy zaimplementujesz metody
RecyclerView.Adapter
, generuje:Zaktualizuj kod, aby zawierał:
Oczywiście, jeśli masz zero przedmiotów w swoich przedmiotach, wtedy zero rzeczy wyświetli się na ekranie.
(2) Nie robiłem tego, jak pokazano w górnej odpowiedzi: CardView layout_width = "match_parent" nie pasuje do nadrzędnej szerokości RecyclerView
(3) EDYCJA: BONUS: Upewnij się również, że skonfigurowałeś
RecyclerView
tak:Nie tak jak to:
Widziałem kilka samouczków wykorzystujących tę drugą metodę. Chociaż działa, myślę, że generuje również ten błąd.
źródło
public int getItemCount() { return artists == null ? 0 : artists.size(); }
i LayoutInflaterView itemView = LayoutInflater. from(parent.getContext()).inflate(R.layout.fragment_listitem, parent, false);
Mam z tobą tę samą sytuację, wyświetlanie jest w porządku, ale błąd pojawia się w lokalizacji. To jest moje rozwiązanie: (1) Zainicjuj RecyclerView & bind adapter NA UTWÓRZ ()
(2) wywołaj powiadomienie DataStateChanged po otrzymaniu danych
W kodzie źródłowym recyclinglerView jest inny wątek do sprawdzania stanu danych.
W dispatchLayout () możemy znaleźć błąd:
źródło
Mam ten problem, problem z kilkoma razami jest recycleView umieszczony w obiekcie ScrollView
Po sprawdzeniu implementacji wydaje się, że jest to następujący powód. Jeśli RecyclerView zostanie umieszczony w ScrollView, wówczas podczas kroku pomiaru jego wysokość jest nieokreślona (ponieważ ScrollView dopuszcza dowolną wysokość), w wyniku czego staje się równa minimalnej wysokości (zgodnie z implementacją), która najwyraźniej wynosi zero.
Masz kilka opcji, aby to naprawić:
(Można również śledzić
android.support.v4.widget.NestedScrollView
)źródło
1) Utwórz ViewHolder , który nic nie robi :)
2) Ponownie utwórz RecyclerView , który nic nie robi :)
3) Teraz, gdy twój prawdziwy recykler nie jest gotowy, po prostu użyj próbki takiej jak poniżej.
Nie jest to jednak najlepsze rozwiązanie, ale działa! Mam nadzieję, że to jest pomocne.
źródło
Dzieje się tak, gdy adapter nie jest ustawiany podczas fazy tworzenia:
Po prostu przenieś ustawienie adaptera do onCreate z pustymi danymi, a kiedy masz połączenie danych:
źródło
Sprawdź, czy nie udało Ci się wywołać tej metody w adapterze
źródło
Upewnij się, że ustawiłeś menedżera układu dla RecyclerView przez:
Zamiast tego
LinearLayoutManager
możesz użyć także innych menedżerów układu.źródło
Miałem ten sam błąd, który naprawiłem, robiąc to, jeśli czekasz na dane takie jak ja za pomocą modernizacji lub czegoś takiego
Umieść przed Oncreate
Umieść je w swoim Oncreate
Po otrzymaniu danych umieścić
Teraz przejdź do klasy ArtistArrayAdapter i zrób to, co zrobi, jeśli twoja tablica jest pusta lub ma wartość zerową, spowoduje to, że GetItemCount zwróci 0, jeśli nie, sprawi, że będzie ona wielkości tablicy artystów
źródło
Te linie muszą znajdować się w
OnCreate
:źródło
Dzieje się tak, ponieważ faktyczny napompowany układ różni się od tego, który został wskazany przez Ciebie podczas wyszukiwania programu recyclinglerView. Domyślnie podczas tworzenia fragmentu metoda onCreateView wygląda następująco:
return inflater.inflate(R.layout.<related layout>,container.false);
Zamiast tego osobno utwórz widok i użyj go, aby odnieść się do recyclinglerView
View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view;
źródło
Najpierw zainicjuj adapter
Kiedykolwiek nastąpi zmiana w zestawie danych, wystarczy wywołać metodę updateComments.
źródło
Dla tych, którzy korzystają z
RecyclerView
wewnątrz fragmentu i napompować go od innych poglądów: podczas pompowania cały widok fragmentu, upewnij się, że wiązałoRecyclerView
się jego zdaniem głównym.Łączę się i robię wszystko dla adaptera poprawnie, ale nigdy nie zrobiłem wiązania. Ta odpowiedź przez @Prateek Agarwal ma to wszystko dla mnie, ale tutaj jest bardziej opracowanie.
Kotlin
Jawa
źródło
Po prostu zamień powyższy kod na ten i powinno działać. To, co zrobiłeś źle, to nazwa zestawu (Adaptor) przed wywołaniem menedżera układu.
źródło
To jest naprawdę prosty błąd, który się pojawia, nie ma potrzeby wykonywania żadnych kodów w tym. Ten błąd występuje z powodu niewłaściwego pliku układu używanego przez działanie. Przez IDE automatycznie utworzyłem układ v21 układu, który stał się domyślnym układem działania. wszystkie kody, które zrobiłem w starym pliku układu, a nowy miał tylko kilka kodów xml, co doprowadziło do tego błędu.
Rozwiązanie: Skopiuj wszystkie kody starego układu i wklej w układzie v 21
źródło
W moim przypadku ustawiałem adapter w
onLocationChanged()
wywołaniu zwrotnym ORAZ debugowałem w emulatorze. Ponieważ nie wykrył zmiany lokalizacji, nigdy nie został uruchomiony. Kiedy ustawiłem je ręcznie w rozszerzonych kontrolkach emulatora, działało to zgodnie z oczekiwaniami.źródło
Rozwiązałem ten błąd. Wystarczy dodać menedżera układu i dodać pusty adapter.
Podobnie jak ten kod:
źródło
Po prostu dodaj do
RecyclerView
Przykład:
źródło
Miałem ten błąd i próbowałem go naprawić, dopóki nie znalazłem rozwiązania.
Zrobiłem prywatną metodę buildRecyclerView i wywołałem ją dwukrotnie, najpierw w onCreateView, a następnie po moim wywołaniu zwrotnym (w którym pobieram dane z API). To jest moja metoda buildRecyclerView w moim fragmencie:
Poza tym muszę zmodyfikować metodę get-Item-Count w moim adapterze, ponieważ w momencie tworzenia na liście lista jest pusta i pojawia się błąd. Tak więc mój get-item-count jest następujący:
źródło
W mojej sytuacji był to zapomniany komponent, który lokalizuje się w klasie ViewHolder, ale nie został umieszczony w pliku układu
źródło
Miałem ten sam problem i zdałem sobie sprawę, że ustawiałem zarówno LayoutManage r, jak i adapter po pobraniu danych z mojego źródła zamiast ustawiania dwóch w metodzie onCreate .
Następnie powiadomił adapter o zmianie danych
źródło
Ten problem jest, ponieważ nie jesteś dodając dowolny
LayoutManager
dla twojegoRecyclerView
.Innym powodem jest to, że wywołujesz ten kod w NonUIThread. Pamiętaj, aby wywołać to połączenie w UIThread.
Rozwiązaniem jest tylko to, że musisz dodać znak
LayoutManager
„RecyclerView
przed”setAdapter
w wątku interfejsu użytkownika.źródło
Mój problem polegał na tym, że mój widok recyklera wyglądał tak
Kiedy powinno tak wyglądać
źródło
Na
RecyclerView
przykład w klasie adapteraMyRecyclerViewAdapter
utwórz konstruktor o następujących parametrach.mData
to dane, które prześlesz do adaptera. Jest to opcjonalne, jeśli nie masz danych do przekazania.mInflater
toLayoutInflater
obiekt, który utworzyłeś i którego używasz wOnCreateViewHolder
funkcji adaptera.Następnie podłącz adapter w MainActivity lub gdziekolwiek chcesz w wątku main / UI, tak jak chcesz
źródło
Rozwiązany przez ustawienie zainicjowanej pustej listy i adaptera na dole i wywołanie powiadomieniaDataSetChanged podczas pobierania wyników.
źródło
Straciłem 16 minut swojego życia z tym problemem, więc po prostu przyznam się do tego niezwykle żenującego błędu, który popełniłem - używam Butterknife i łączę widok w onCreateView w tym fragmencie.
Długo trwało ustalenie, dlaczego nie miałem menedżera układu - ale oczywiście widoki są wstrzykiwane, więc nie będą miały wartości zerowej, więc recykler nigdy nie będzie zerowy.
Jeśli pojawia się taki problem, śledź swój widok i użyj czegoś podobnego
uiautomatorviewer
źródło
Niewiele odpowiedzi, ale miałem ten sam problem, nawet przy poprawnym kodzie. Czasami jest to tylko najprostsza marka. W takim przypadku błąd OP może również brakować
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
w Manifeście, który odtwarza ten sam błąd.źródło
W moim przypadku stało się tak, ponieważ osadziłem RecyclerView w LinearLayout.
Wcześniej miałem plik układu zawierający tylko jeden główny RecyclerView w następujący sposób
Uważam, że problem dotyczy 3 oddzielnych linii. W każdym razie uważam, że to prosty problem, nie będę pracował nad tym jutro; pomyślałem, że powinienem napisać to, co znalazłem, zanim zapomnę o tym wątku.
źródło
Dodanie jeszcze jednej odpowiedzi, odkąd natknąłem się na ten wątek, przeglądając błąd. Próbowałem zainicjować plik A,
PreferenceFragmentCompat
ale zapomniałem zawęzić preferencje XML wonCreatePreferences
następujący sposób:Błąd był tajemnicą, dopóki nie zdałem sobie sprawy, że
PreferenceFragmentCompat
trzeba używaćRecyclerView
wewnętrznie.źródło
// To się dzieje, gdy nie są ustalone adapter podczas fazy tworzenia call notifyDataSetChanged (), gdy odpowiedź API jest uzyskanie jego pracy
źródło