Czy powinniśmy użyć RecyclerView, aby zastąpić ListView?

232

Dokumenty na Androida mówią:

Widżet RecyclerView to bardziej zaawansowana i elastyczna wersja ListView. Ten widget jest pojemnikiem do wyświetlania dużych zestawów danych, które można bardzo skutecznie przewijać, utrzymując ograniczoną liczbę widoków. Użyj widżetu RecyclerView, jeśli masz kolekcje danych, których elementy zmieniają się w czasie wykonywania na podstawie akcji użytkownika lub zdarzeń sieciowych

Właściwie ListViewmożna wykonać wszystkie powyższe czynności, jeśli wydajność nie ma znaczenia, i znaleźliśmy wiele problemów, gdy używamy RecyclerViewdo zamiany ListView:

  1. Nie ma onItemClickListener () do wyboru pozycji listy - rozwiązanie

  2. Brak podziału między elementami listy - rozwiązanie

  3. Brak wbudowanego selektora nakładania, brak wizualnego sprzężenia zwrotnego po kliknięciu elementu listy - rozwiązanie

  4. Brak addHeaderView dla nagłówka listy - rozwiązanie

Może więcej problemów ...

Więc kiedy używamy RecyclerViewdo zamiany ListView, musimy zrobić dużo dodatkowego kodowania, aby osiągnąć ten sam efekt co ListView.

PYTANIE:

  • Czy warto wymienić, że ListViewz RecyclerViewcałkowicie?
  • jeśli nie, to w którym przypadku powinniśmy RecyclerViewraczej użyć zamiast tego ListViewi odwrotnie?
Xcihnegn
źródło
9
twój wątek to tylko pierwszy numer i nie jest to moje pytanie
Xcihnegn
3
Wystarczy wspomnieć, że musisz użyć widoku recyklera, jeśli chcesz użyć zwiniętego paska akcji. medium.com/android-bites/…
francas
powinieneś użyć recyclinglerview, ponieważ oferuje on większą kontrolę niż widok listy. To trochę skomplikowane, ale dotrzesz tam, a wtedy twoje życie będzie super łatwe, gdy masz do czynienia z listami.
Sadashiv
3
lepszy jest wróg dobra.
seniorgod

Odpowiedzi:

118

Jeśli ListView działa dla Ciebie, nie ma powodu do migracji. Jeśli piszesz nowy interfejs użytkownika, może być lepiej z RecyclerView.

RecyclerView jest potężny, gdy potrzebujesz dostosować swoją listę lub potrzebujesz lepszych animacji. Te metody wygody w ListView spowodowały wiele problemów dla ludzi, dlatego RecyclerView zapewnia im bardziej elastyczne rozwiązanie.

Główną zmianą, którą należy wprowadzić podczas migracji, jest adapter. Jeśli chcesz nadal dzwonić notifyDataSetChanged, tracisz większość korzyści związanych z animacją i wiązaniem. Ale jeśli możesz zmienić adapter, aby wywoływał szczegółowe zdarzenia powiadamiania (dodane / usunięte / przeniesione / zaktualizowane), to uzyskasz znacznie lepsze animacje i wydajność. Te zdarzenia pozwalają RecyclerView wybrać prawidłowe animacje, a także pomaga uniknąć niepotrzebnych onBindpołączeń. Otrzymasz ogromną korzyść, jeśli Twoje widoki przedmiotów są złożone. Idąc dalej, wokół RecyclerView będzie więcej komponentów.

Yigit
źródło
2
Gdybym mógł dać ci 100 głosów pozytywnych, zrobiłbym to. Ta notifyDataSetChanged()metoda sprawiała, że RecyclerViewciągle prosiłem o nowe ViewHolders, wypatroszywszy zalety tego ViewHolderwzoru. Poszukując rozwiązania znalazłem twój komentarz, który mimochodem bardzo odpowiada: D dzięki!
Aspiring Dev
Nie zgadzam się „Otrzymasz ogromną korzyść, jeśli Twoje widoki przedmiotów są złożone”, mam recyclinglerView, w którym adapter ma 3, jeśli inaczej, Recyclerview działa słabo w moim przypadku. Musiałem wyłączyć korzystanie z recyklingu, isRecyclable(false);a końcowy wynik jest bardzo opóźniony RecyclerView. Nie mogę tego nawet zmienić, powrót do
widoku
4
ludzie używają RV w / wiele innych typów niż bez żadnego problemu i dobrej wydajności. W twoim kodzie jest coś jeszcze nie tak. Powinieneś użyć systrace / traceview i zobaczyć, co się dzieje.
yigit
1
@kashyapjimuliya jak wspomniał yigit , 3 jeśli-inaczej nie powinno tego powodować. Po pierwsze, nie wspomniałeś, gdzie je umieściłeś; po drugie, wyłączenie recyklingu powinno spowolnić, a nie przyspieszyć. Czemu? Ponieważ nadmuchiwanie widoku i robienie findViewById()jest dużo droższe niż robienie tego po ViewHolderswojemu.
Sufian,
24

Według mnie, jeśli ListView spełnia wszystkie bieżące potrzeby twojej aplikacji i spełnia wszystkie przypadki użycia, nie ma potrzeby zastępowania jej RecyclerView.

RecyclerView daje ogromną moc swoim programistom kosztem zwiększenia złożoności dla programistów. Są pewne rzeczy, które można łatwo zrobić w ListView, które mogą teraz wymagać niepotrzebnego wysiłku.

Ale tak, istnieje wiele rzeczy, których ListView nigdy nie może zrobić, na przykład niesamowita funkcja LayoutManager, która umożliwia dynamiczną zmianę układu na poziomą, pionową, siatkę lub siatkę naprzemienną.

Szczegółową odpowiedź na ten temat napisałem tutaj .

Aritra Roy
źródło
3
Oczywiście RecyclerView zwiększa złożoność, ale przynajmniej odpowiednio implementuje wzór ViewHolder.
IgorGanapolsky
@IgorGanapolsky +1 za wdrożenie wzorca ViewHolder.
Sreekanth Karumanaghat
możesz napisać własny wzór uchwytu widoku, korzystając z ListView
dan
9

1 Możesz użyć interfejsu, aby zapewnić odbiornik kliknięć. Używam tej techniki również w ListViews.
2 Bez dzielnika: Po prostu dodaj do swojego rzędu widok o szerokości match_parent i wysokości 1dp i nadaj mu kolor tła .
3 Wystarczy użyć selektora StateList dla tła wiersza.
4 addHeaderView można również uniknąć w ListViews: po prostu umieść nagłówek poza widokiem.

Jeśli więc zależy Ci na wydajności, to tak , dobrym pomysłem jest zastąpienie ListView RecyclerView.

Phantômaxx
źródło
19
To nie są moje pytania, miałem link do każdego rozwiązania problemu
Xcihnegn
6

Do niedawna nadal korzystałem z ListView do bardzo prostych list. Na przykład, jeśli chcę wyświetlić prostą listę opcji tekstowych ...

Oparłem tę decyzję na „czynnikach ludzkich”, że utworzenie prostego ListView z mniejszym kodem jest lepsze, jeśli wydajność jest nieistotna. Często myślę o profesorze na studiach, który lubił mówić: „Mój nauczyciel, wielki Niclaus Wirth, wynalazca Pascala, zwykł mawiać, że jeśli program ma więcej niż 50 linii kodu, to na pewno się myli ...”

Ale to, co przekonało mnie do zaprzestania używania ListView, to fakt, że został on niedawno przeniesiony do kategorii „Starsze” w narzędziu do projektowania Android Studio wraz z RelativeLayout.

https://developer.android.com/reference/android/widget/ListView

Myślę, że jest to „miękka” forma „deprecjacji”. Byłoby to zbyt destrukcyjne, gdyby było przestarzałe i wszyscy sumienni programiści przenieśli swój kod do RecyclerView.

Ponadto wprowadzenie do ListView ostrzega u góry, że RecyclerView jest lepszą opcją: „Aby uzyskać bardziej nowoczesne, elastyczne i wydajne podejście do wyświetlania list, użyj RecyclerView”.
https://developer.android.com/reference/android/widget/ListView

Ponadto przewodnik po ListView wciąż mówi o modułach ładujących kursor, ale sam getSupportCursorLoader () został właśnie przestarzały w API 28.
https://developer.android.com/guide/topics/ui/layout/listview

Najnowsze ulepszenia w Android Studio:

Plik -> Nowy -> Fragment -> Fragment (lista)

To daje nam w pełni działający RecylerView wypełniony podstawowym tekstem. Pozbywa się to mojego ostatniego prawdziwego powodu używania ListView, ponieważ teraz równie łatwo jest skonfigurować podstawowy RecylerView.

Podsumowując, nie zamierzam w ogóle używać ListView do nowego rozwoju, ponieważ oznaczanie go jako „starszego” jest o krok od wycofania go.

Elletlar
źródło
3

Jedynym przypadkiem, gdy nadal można używać ListView, jest to, że lista nie jest dynamiczna lub nie ma na nią wpływu zdarzenia sieciowe. Na przykład: nawigacja.

Do wszelkich innych zastosowań RecyclerView przyćmiewa ListView. Ponieważ RecyclerView dba tylko o recykling, łatwiej będzie robić rzeczy związane wizualnie, które były ściśle powiązane w ListView, takie jak zmiana pozycji / przestawienie, animacja (w rzeczywistości jest to RecyclerView.ItemAnimator), niestandardowe układy (zapas ma StaggeredGrid oprócz stara lista lub styl siatki, ale jest też ta biblioteka, która jeszcze bardziej ją rozszerza).

Również jeśli chcesz użyć CardView, uważam, że jest to jedyna droga ( dobry odczyt, kiedy użyć karty lub listy).

mit
źródło
Czy chodzi Ci o pobranie listy danych z serwerów, a następnie zapisanie ich w sqlite w telefonie, aby użyć ich w widoku listy (powiedzmy, że twoi obserwatorzy), lepiej jest użyć widoku recyklera niż widoku listy z uchwytem widoku ?
Lion789,
Tak. Ale mówiąc dokładniej, nie widzę już żadnej roli ListView poza nawigacją, a to dlatego, że uważam, że używanie RecyclerView jest przesadą.
inmyth
2

Świetną alternatywą jest użycie BaseAdapter. Obsługuje użycie Wzorca Viewholder, a mój zawiera ponad 100 wierszy z mapami bitowymi i przyciskami i działa bardzo płynnie.

grantespo
źródło