Jestem przyzwyczajony do umieszczania specjalnego widoku wewnątrz pliku układu, jak opisano w ListActivity
dokumentacji, która ma być wyświetlana, gdy nie ma żadnych danych . Ten widok ma identyfikator "android:id/empty"
.
<TextView
android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/no_data" />
Zastanawiam się, jak można to zrobić z nowym RecyclerView
?
setEmptyView()
metody przeciwkoRecyclerView
...setEmptyView()
miał też wadę. Podczas ładowania danych nie chcieliśmy pokazywać pustego widokuListView
, ale tak się stało. Musieliśmy więc wprowadzić logikę. Obecnie używam stackoverflow.com/a/48049142/2914140 .Odpowiedzi:
W tym samym układzie, w którym zdefiniowano
RecyclerView
, dodajTextView
:Przy
onCreate
odpowiednim oddzwonieniu sprawdzasz, czy zestaw danych, który karmi twój,RecyclerView
jest pusty. Jeśli zestaw danych jest pusty, to równieżRecyclerView
jest pusty. W takim przypadku komunikat pojawi się na ekranie. Jeśli nie, zmień jego widoczność:źródło
Dla moich projektów Zrobiłem to rozwiązanie (
RecyclerView
zsetEmptyView
metody):I powinieneś użyć go zamiast
RecyclerView
klasy:i
źródło
Oto rozwiązanie wykorzystujące tylko niestandardowy adapter z innym typem widoku dla pustej sytuacji.
źródło
getItemCount()
powinien być oneliner, ale tutaj mamy nietrywialneif
z ukrytą logiką. Ta logika pojawia się również niezręczniegetItemViewType
i Bóg wie, gdzie jeszczeUżywam ViewSwitcher
w kodzie sprawdzisz kursor / zestaw danych i przełączysz widoki.
Możesz także ustawić animacje, jeśli chcesz, za pomocą kilku linii kodu
źródło
Ponieważ odpowiedź Kevina nie jest kompletna.
To jest bardziej poprawna odpowiedź, jeśli używasz
RecyclerAdapter
„snotifyItemInserted
oraznotifyItemRemoved
do aktualizacji zbioru danych. Zobacz wersję Kotlin dodaną poniżej przez innego użytkownika.Jawa:
Kotlin
źródło
RVEmptyObserver
Zamiast korzystania z niestandardowego
RecyclerView
, rozszerzenieAdapterDataObserver
jest prostszym rozwiązaniem, które pozwala ustawić niestandardoweView
wyświetlane, gdy nie ma żadnych elementów na liście:Przykładowe użycie:
Klasa:
źródło
checkIfEmpty()
sięonChanged()
ionItemRangeInserted()
Na twoim adapterze
getItemViewType
sprawdź, czy karta ma 0 elementów, a jeśli tak, zwróć inny typ widoku.Następnie
onCreateViewHolder
sprawdź, czy viewType jest tym, który zwróciłeś wcześniej, i nadmuchaj inny widok. W tym przypadku plik układu z tym TextViewEDYTOWAĆ
Jeśli to nadal nie działa, możesz ustawić rozmiar widoku programowo w następujący sposób:
A potem, gdy zawyżysz widok połączenia:
źródło
onCreateViewHolder
kiedy mój zestaw danych jestnull
albo pusty, ponieważ muszę wrócić0
wgetItemCount
.android:layout_gravity="center"
iandroid:layout_height="match_parent"
dla widoku nadrzędnego recyklera.android:layout_height="match_parent"
. Chociaż rząd nie rozwija się do wysokości ekranu.Oto moja klasa do pokazywania pustego widoku, ponawiania widoku (w przypadku niepowodzenia ładowania interfejsu API) i postępu ładowania dla
RecyclerView
Activity_xml
Źródło znajduje się tutaj https://github.com/PhanVanLinh/AndroidRecyclerViewWithLoadingEmptyAndRetry
źródło
Użyj AdapterDataObserver w niestandardowym RecyclerView
Kotlin:
RecyclerViewEnum.kt
RecyclerViewEmptyLoadingSupport.kt
layout.xml
w działaniu użyj tego:
źródło
StringDef
lubIntDef
adnotacjamiDodałem
RecyclerView
i alternatywęImageView
dlaRelativeLayout
:a następnie w
Adapter
:źródło
mRecyclerView
wnętrzaAdapter
Jeszcze jednym sposobem jest użycie, w
addOnChildAttachStateChangeListener
których uchwytach pojawiają się / znikają widoki dzieckaRecyclerView
.źródło
Wystarczy, że pracujesz z FirebaseRecyclerAdapter, ten post działa jako urok https://stackoverflow.com/a/39058636/6507009
źródło