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 ListView
można wykonać wszystkie powyższe czynności, jeśli wydajność nie ma znaczenia, i znaleźliśmy wiele problemów, gdy używamy RecyclerView
do zamiany ListView
:
Nie ma onItemClickListener () do wyboru pozycji listy - rozwiązanie
Brak podziału między elementami listy - rozwiązanie
Brak wbudowanego selektora nakładania, brak wizualnego sprzężenia zwrotnego po kliknięciu elementu listy - rozwiązanie
Brak addHeaderView dla nagłówka listy - rozwiązanie
Może więcej problemów ...
Więc kiedy używamy RecyclerView
do zamiany ListView
, musimy zrobić dużo dodatkowego kodowania, aby osiągnąć ten sam efekt co ListView
.
PYTANIE:
- Czy warto wymienić, że
ListView
zRecyclerView
całkowicie?- jeśli nie, to w którym przypadku powinniśmy
RecyclerView
raczej użyć zamiast tegoListView
i odwrotnie?
źródło
Odpowiedzi:
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ąć niepotrzebnychonBind
połą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.źródło
notifyDataSetChanged()
metoda sprawiała, żeRecyclerView
ciągle prosiłem o noweViewHolders
, wypatroszywszy zalety tegoViewHolder
wzoru. Poszukując rozwiązania znalazłem twój komentarz, który mimochodem bardzo odpowiada: D dzięki!isRecyclable(false);
a końcowy wynik jest bardzo opóźniony RecyclerView. Nie mogę tego nawet zmienić, powrót dofindViewById()
jest dużo droższe niż robienie tego poViewHolder
swojemu.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 .
źródło
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.
źródło
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.
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:
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.
źródło
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).
źródło
Ś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.
źródło