RecyclerView vs. ListView


295

Od programisty Androida ( Tworzenie list i kart ):

Widżet RecyclerView to bardziej zaawansowana i elastyczna wersja ListView.

Ok, to brzmi świetnie, ale kiedy zobaczyłem ten przykładowy obraz, bardzo się zdezorientowałem co do różnicy między tymi dwoma.

wprowadź opis zdjęcia tutaj

Powyższe zdjęcie można łatwo utworzyć za ListViewpomocą niestandardowego adaptera.

Więc w jakiej sytuacji należy skorzystać RecyclerView?



1
@ Dev786: Sugeruję dodanie tutaj komentarza wyjaśniającego szczegółowo, czego brakuje w wielu istniejących odpowiedziach na to pytanie.
CommonsWare

Odpowiedzi:


374

RecyclerViewzostał stworzony jako ListViewulepszenie, więc tak, możesz utworzyć załączoną listę z ListViewkontrolą, ale korzystanie RecyclerViewjest łatwiejsze, ponieważ:

  1. Ponownie wykorzystuje komórki podczas przewijania w górę / w dół - jest to możliwe dzięki implementacji View Holder w ListViewadapterze, ale było to opcjonalne, podczas gdy wRecycleView domyślnym sposobie pisania adaptera.

  2. Oddziela listę od kontenera - dzięki czemu można łatwo umieszczać elementy listy w czasie wykonywania w różnych kontenerach (linearLayout, gridLayout) z ustawieniemLayoutManager .

Przykład:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
  1. Animuje typowe akcje na liście - animacje są oddzielone i delegowane do ItemAnimator.

Jest więcej na temat RecyclerView , ale myślę, że te kwestie są najważniejsze.

Podsumowując, RecyclerViewjest to bardziej elastyczna kontrola do obsługi „danych listy”, która podąża za wzorcami przekazywania obaw i pozostawia sobie tylko jedno zadanie - recykling elementów.


16
Głównym obowiązkiem widoku listy jest 1.) wizualne rozmieszczenie elementów w danym obszarze, a najlepiej 2.) ponowne użycie elementów. Dzięki RecylerView podział ten dzieli się na pojedyncze obowiązki - widok recyklingu jest przetwarzany, a program LayoutManager rozmieszcza elementy na ekranie. Innymi słowy, widok recyklingu nie wie / nie dba o to, gdzie umieścić przedmioty na ekranie, po prostu dba o ich recykling. Z systemu Android doc: „Zmieniając LayoutManager, RecyclerView może być użyty do implementacji standardowej listy przewijanej pionowo, jednolitej siatki, stopniowanych siatek, kolekcji przewijanych w poziomie i więcej.”
daneejela

32
„Użyj ponownie komórek podczas przewijania w górę / w dół”: o ile wiem, jest to całkowicie błędne, ponieważ dzieje się tak nawet w widoku listy bez widoku.
Ruban

16
Głównym zastosowaniem uchwytu widoku w widoku listy jest Twój kod może często wywoływać findViewById () podczas przewijania ListView, co może spowolnić działanie. Nawet gdy adapter zwróci nadmuchany widok do recyklingu, nadal musisz sprawdzić elementy i zaktualizować je. Sposobem na wielokrotne użycie findViewById () jest użycie wzorca projektowego „view holder”. Obiekt ViewHolder przechowuje każdy widok komponentu wewnątrz pola znacznika Układu, dzięki czemu można natychmiast uzyskać do niego dostęp bez potrzeby wielokrotnego wyszukiwania.
Ruban

7
Próbuję powiedzieć, że Row zostanie poddany recyklingowi, nawet jeśli zaimplementujesz widok listy bez uchwytu widoku. To jest właściwość i zaleta widoku listy. Właśnie to stworzyli widok listy.
Ruban

nie zrobili nic specjalnego, każdy może dodać te funkcje. możesz rozszerzyć ListView i baseAdapter i dodać dowolną funkcję, jeśli chcesz. tak naprawdę nie ma między nimi żadnej różnicy.
MDP

39

Aby widoki listy miały dobrą wydajność, musisz zaimplementować wzorzec uchwytu, i łatwo to zepsuć, szczególnie gdy chcesz zapełnić listę kilkoma różnymi rodzajami widoków.

RecyclerView wypala ten wzór, co utrudnia zepsucie. Jest również bardziej elastyczny, ułatwiając obsługę różnych układów, które nie są proste liniowe, jak siatka.


6
Tak ! , powinno być więcej dyskusji na temat tego, kiedy NIE należy korzystać z funkcji recyclinglerview. Jeśli Twoje wiersze mają zawartość dodawaną dynamicznie na podstawie danych modelu i korzystasz z widoku Recycler, BOOM.
Rana Deep

1
Powinieneś być w stanie dodać zawartość dynamiczną na podstawie danych modelu. Musisz tylko skonfigurować różne widoki dla każdego rodzaju treści, które chcesz obsługiwać.
CaptRespect,

36

ListViewjest przodkiem RecyclerView. Było wiele rzeczy, które ListViewalbo nie działały, albo nie działały dobrze. Jeśli ListViewmiałbyś uzupełnić niedociągnięcia i rozwiązać problem, dzieląc problemy na różne domeny, uzyskałbyś coś w rodzaju widoku recyklera. Oto główne problemy z ListViews:

  • Nie wymuszał Viewponownego użycia dla tych samych typów elementów (spójrz na jeden z adapterów używanych w a ListView, jeśli przestudiujesz metodę getView, zobaczysz, że nic nie stoi na przeszkodzie, aby programista utworzył nowy widok dla każdego wiersza, nawet jeśli zostanie przekazany przez convertViewzmienną)

  • Nie zapobiegło to kosztownym findViewByIdzastosowaniom (nawet jeśli przetwarzałeś widoki, jak wspomniano powyżej, możliwe było, że deweloperzy dzwonili, aby findViewByIdzaktualizować wyświetlaną zawartość widoków potomnych. Głównym celem ViewHolderwzorca ListViewsbyło buforowanie findViewByIdpołączeń. Jednak było to tylko dostępne, jeśli o tym wiesz, ponieważ w ogóle nie była częścią platformy)

  • Obsługiwane tylko przewijanie w pionie z widokami wyświetlanymi w wierszu (widok Recycler nie przejmuje się tym, gdzie widoki są umieszczane i jak są przenoszone, jest on abstrakcyjny jako a LayoutManager. Recycler może zatem obsługiwać tradycyjne, ListViewjak pokazano powyżej, a także takie rzeczy jak GridView, ale nie jest to ograniczone, może zrobić więcej, ale musisz wykonać pracę programistyczną, aby tak się stało).

  • Animacje do dodania / usunięcia nie były rozważanym przypadkiem użycia. Od Ciebie zależało, jak sobie z tym poradzić (porównaj RecyclerView. Klasy adapterów powiadomiły * oferty metod v. ListViews, aby uzyskać pomysł).

Krótko mówiąc, RecyclerViewjest to bardziej elastyczne podejście ListView, aczkolwiek może być konieczne więcej kodowania z twojej strony.


20

RecyclerViewTo nowy ViewGroup że jest przygotowana do świadczenia żadnego widoku karty oparte na podobnej zasadzie. Przypuszcza się, że jest następcą ListView and GridViewi można go znaleźć w latest support-v7 version. Został RecyclerViewon opracowany z myślą o rozszerzalności , dzięki czemu można stworzyć dowolny układ, o którym możesz pomyśleć, ale nie bez małej dawki bólu w dupie.

Odpowiedź pochodzi od Antonio leiva

 compile 'com.android.support:recyclerview-v7:27.0.0'

RecyclerViewjest rzeczywiście powerful viewniż ListView. Aby uzyskać więcej informacji, odwiedź tę stronę .


5
Podoba mi się to zdanie z Twojej odpowiedzi: To jest Android, więc rzeczy nigdy nie są łatwe. To prawda, czym było tworzenie aplikacji na Androida, ale myślę, że to coś złego w tym, jak zaprojektowali API, a także wzorce do zbudowania Aplikacja na Androida Teoretycznie dobry projekt powinien ukryć wszystkie możliwe złożoności przed programistami (ale nadal powinien być dostępny dla zaawansowanych), to, na czym zazwyczaj dbają, to logika biznesowa, dane i inne algorytmy inne niż walka z obsługą problemów związanych z interfejsem użytkownika (i bardziej żmudne problemy, które obecnie występują w rozwoju Androida).
Beznadziejny

18

Poniżej przedstawiono kilka kluczowych punktów / różnic między RecyclerView i ListView. Mądrze odbieraj połączenia.

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.

RecylerView ma wbudowany ViewHolder, nie musi implementować naszego własnego jak w listView. Obsługuje także powiadomienia przy określonym indeksie

Rzeczy takie jak animowanie dodawania lub usuwania elementów są już zaimplementowane w RecyclerView bez konieczności robienia czegokolwiek

Możemy powiązać menedżera układu z RecyclerView, można go użyć do uzyskania losowych widoków w widoku kosza, podczas gdy było to ograniczenie w ListView W ListView jedynym dostępnym typem widoku jest pionowy ListView. Nie ma oficjalnego sposobu na wdrożenie nawet poziomego ListView. Teraz za pomocą RecyclerView możemy mieć

i) LinearLayoutManager - który obsługuje zarówno listy pionowe, jak i poziome, ii) StaggeredLayoutManager - który obsługuje Pinterest jak listy rozłożone, iii) GridLayoutManager - który obsługuje wyświetlanie siatek widocznych w aplikacjach Galerii.

A najlepsze jest to, że możemy to wszystko robić dynamicznie, jak chcemy.


14

Główna zaleta:

ViewHoldernie jest domyślnie dostępny w ListView. Będziemy tworzyć jawnie wewnątrz getView(). RecyclerViewma wbudowane Viewholder.


4

Oprócz powyższych różnic jest jeszcze kilka innych:

  1. RV oddziela tworzenie widoku i wiązanie danych do wyświetlenia. W LV musisz sprawdzić, czy convertView ma wartość NULL czy nie, aby utworzyć widok, zanim powiążesz z nim dane. Tak więc, w przypadku RV, widok zostanie utworzony tylko wtedy, gdy jest potrzebny, ale w przypadku LV można przeoczyć kontrolę konwersji i utworzy widok za każdym razem.

  2. Przełączanie między tabelą a listą jest teraz łatwiejsze dzięki narzędziu LayoutManager.

  3. Nie trzeba powiadamiać i aktualizować wszystkich elementów, nawet jeśli zmieni się tylko jeden element.

  4. W przypadku LV należało wdrożyć buforowanie widoku. Domyślnie jest dostarczany w RV. (Istnieje różnica między buforowaniem widoku a recyklingiem.)

  5. Bardzo łatwe animacje przedmiotów w przypadku kampera.


4

Zalety RecyclerView w porównaniu do widoku listy:

  1. Domyślnie zawiera ViewHolder.

  2. Łatwe animacje.

  3. Obsługuje układy poziome, siatkowe i schodkowe

Zalety listy Widok w porównaniu do recyklera Widok:

  1. Łatwy do dodania dzielnik.

  2. Może używać wbudowanego adaptera tablicowego do prostych list prostych

  3. Obsługuje nagłówek i stopkę.

  4. Obsługuje OnItemClickListner.


4
O ile rozumiem, możesz łatwo dodać dzielnik do recyklera Wyświetl używając recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));po zrobieniu czegoś takiegorecyclerView = view.findViewById(R.id.feed);
nviens

1
@ nviens Aby wyświetlić listę, możesz dodać dzielnik, wyregulować jego wysokość i zmienić jego kolor - wszystko w xml it self. Również bieżąca implementacja dzielnika jest w porządku, koszmarem było wcześniej dodać dzielnik do recyclinglerview, po prostu sprawdź tę odpowiedź, aby zobaczyć, jak poprzednia implementacja dzielnika była stackoverflow.com/a/27037230/6478047
Manohar Reddy

4

8 różnic między RecyclerView i ListView

Recyclerview vs ListView

1. ViewHolder Pattern

Wzorzec używany do ograniczenia wywołań findViewById () metod .

W ListView możesz łatwo zbudować listę bez użycia ViewHolder. Ale nie w przypadku RecyclerView.

2. Adapter

Oba są AdapterViews, tak. Działa w oparciu o klasę adaptera.

ListView można łatwo zbudować przy użyciu domyślnych adapterów, takich jak ArrayAdapter, CursorAdapter, ale RecyclerView zapewnia klasę RecyclerView.Adapter, aby utworzyć nową niestandardową klasę adaptera.

Nie można używać ArrayAdapter ani żadnego innego wbudowanego adaptera z RecyclerView.

3. Rozmieszczenie przedmiotów

Stworzyłem Vertical ListView w prostym i mniejszym kodzie. Ale co, jeśli musimy utworzyć GridView?

RecyclerView używa LayoutManager do układania swoich elementów. Istnieją 3 klasy LayoutManager.

  • LinearLayoutManager - pomaga utworzyć listę typów liniowych.
  • GridLayoutManager - Używany do tworzenia siatki.
  • StaggeredGridLayoutManager - Używany do tworzenia siatki przestawnej.

Animacje

ListView nie ma podstawowych animacji. RecyclerView ma jednak proste animacje.

Rozdzielacz

Android: dzielnik i android: dividerHeight atrybutów lub setDivider (), setDividerHeight () pozwala na wykonywanie niestandardowych dzielnik w ListView.

od 25.1.0 można użyć klasy DividerItemDecoration, aby utworzyć prosty dzielnik.

Kliknij Wydarzenia

RecyclerView nie ma OnItemClickListener , tak, to bardzo smutne. Dają jednak większą kontrolę programistom, udostępniając RecyclerView.OnItemTouchListener.

Metody powiadomień

Musisz wywołać odpowiednie metody powiadomień *, aby wykonać prawidłowe animacje. RecylcerView ma wiele metod powiadomień * w porównaniu z ListView.


3

Myślę, że główną i największą różnicą, jaką mają, jest to, że ListViewszuka pozycji przedmiotu podczas jego tworzenia lub umieszczania, z drugiej strony RecyclerViewszuka rodzaju przedmiotu. jeśli istnieje inny element utworzony z tego samego typu RecyclerView, nie tworzy go ponownie. Pyta najpierw o adapter, a następnie pyta o pulę recyklingu, jeśli pula recyklingu mówi „tak, stworzyłem podobny typ”, to RecyclerViewnie próbuje utworzyć tego samego typu. ListViewnie ma tego rodzaju mechanizmu łączenia.


2

Moim zdaniem RecyclerViewpodjęto próbę rozwiązania problemu z wzorcem recyklingu stosowanym w widokach list, ponieważ utrudniało to życie programistom. Wszystko inne, z czym mógłbyś sobie poradzić mniej więcej. Na przykład mogę używać tego samego adaptera pod kątem ListViewi GridViewto nie ma znaczenia w obu poglądów getView, getItemCount, getTypeCountsłuży więc jest to samo. RecyclerViewnie jest potrzebne, jeśli ListViewz ListAdapterlub GridViewz adapterami sieciowymi już działa. Jeśli poprawnie zaimplementowałeś ViewHolderwzorzec w widokach listy, nie zobaczysz żadnej znaczącej poprawy RecycleView.


2

Pracowałem trochę RecyclerViewi nadal wolę ListView.

  1. Jasne, oba używają ViewHolders, więc nie jest to zaleta.

  2. A RecyclerViewjest trudniejszy w kodowaniu.

  3. A RecyclerViewnie zawiera nagłówka i stopki, więc jest minusem.

  4. A ListViewnie wymaga tworzenia ViewHolder. W przypadkach, gdy chcesz mieć listę z sekcjami lub podtytułami, dobrym pomysłem byłoby tworzenie niezależnych elementów (bez ViewHoldera), jest to łatwiejsze i nie wymaga oddzielnych klas.


1
możesz zrobić nagłówek i zawartość po stronie adaptera recyclinglerview i będzie on bardziej elastyczny niż widok listy. po prostu trudno zmienić widok listy myśli na recyclinglerview, ale jeśli możesz to zrobić, zrozumiesz, co mam na myśli. lista widok przestarzała po prostu spróbuj nauczyć się
recyclinglerview

2
@erginduran, użyłem obu. ListView jest nadal szeroko stosowany i nie jest przestarzały. Również marnuje mniej pamięci niż RecyclerView. Jeśli chcesz tylko zastąpić ListView RecyclerView, nie będzie to dobry pomysł.
CoolMind,

po prostu sprawdź, dlaczego ci faceci opracowali przegląd recyklingu? poprawa widoku listy, prawda? istnieje wiele starych bibliotek i aplikacji w Google Play, więc masz rację, widok listy jest nadal szeroko stosowany. zostaw stare rzeczy w przeszłości. sprawdź porównania -> link
erginduran 26.09.16

@erginduran, dzięki. Masz rację, RecyclerView ma pewne zalety. Moja odpowiedź dotyczyła zwykłych zadań, w których ListView jest czasem łatwiejsze niż RecyclerView. Oczywiście animacja i niektóre inne ulepszenia są trudne lub niemożliwe w widoku listy.
CoolMind,

Dodałem kilka aspektów w tym temacie, patrz stackoverflow.com/a/39721769/2914140 .
CoolMind

1
  1. Możesz użyć interfejsu, aby zapewnić odbiornik kliknięć. Używam tej techniki również w ListViews.
  2. Bez dzielnika: po prostu dodaj w swoim rzędzie 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.


0

Prosta odpowiedź: powinieneś używać RecyclerView w sytuacji, gdy chcesz pokazać wiele przedmiotów, a ich liczba jest dynamiczna. ListView należy stosować tylko wtedy, gdy liczba elementów jest zawsze taka sama i jest ograniczona do rozmiaru ekranu.

Trudniej, bo myślisz tylko z myślą o bibliotece na Androida.

Obecnie istnieje wiele opcji, które pomagają budować własne adaptery, ułatwiając tworzenie list i siatek dynamicznych elementów, które można wybierać, zmieniać kolejność, używać animacji, dzielników, dodawać stopki, nagłówki itp.

Nie bój się i spróbuj RecyclerView, możesz zacząć go kochać, tworząc listę 100 elementów pobranych z Internetu (np. Wiadomości z Facebooka) w ListView i RecyclerView, zobaczysz różnicę w UX (użytkownik doświadczenie) podczas próby przewijania prawdopodobnie aplikacja testowa zatrzyma się, zanim będzie można to zrobić.

Zalecam sprawdzenie tych dwóch bibliotek w celu tworzenia łatwych adapterów:

FastAdapter autorstwa mikepenz

FlexibleAdapter autorstwa davideas


1
Myślę, że twoje wypowiedzi na temat różnicy wydajności między tymi dwoma są przesadzone. Używam ListView w aplikacji produkcyjnej od 2012 roku, wyświetlając do 3000 elementów z ~ 10 różnymi widokami w każdym rzędzie, absolutnie nie ma problemów z wydajnością nawet na starych urządzeniach z Androidem 2.3.
Magnus W

0

RecyclerView info

RecyclerViewZostał wprowadzony Android 5.0 (Lollipop). jest zawarty w bibliotece pomocy technicznej . Dlatego jest kompatybilny z Android API API Poziom 7.

Podobnie jak w przypadku ListView, RecyclerView’sgłówną ideą jest dostarczenie wystawianie funkcjonalność w spektaklu przyjazny sposób. Części „Recycler” w tym widoku nie ma przypadku. RecyclerViewMoże faktycznie recyklingu przedmiotów, z którymi aktualnie pracują. Proces recyklingu odbywa się dzięki wzorowi o nazwie View Holder .

Plusy i minusy RecyclerView

Plusy:

  • zintegrowane animacje do dodawania, aktualizowania i usuwania elementów
  • wymusza recykling widoków przy użyciu wzorca ViewHolder
  • obsługuje zarówno siatki, jak i listy
  • obsługuje przewijanie w pionie i poziomie
  • może być używany razem z DiffUtil

Cons:

  • dodaje złożoności
  • nie OnItemClickListener

Informacje o widoku listy

ListViewIstnieje od samego początku Androida. Był dostępny nawet w API Level 1i ma ten sam cel co RecyclerView.

Korzystanie z ListView jest naprawdę bardzo proste. W tym aspekcie nie jest podobny do następcy. Krzywa uczenia się jest płynniejsza niż w przypadku RecyclerView. Dzięki temu łatwiej jest pojąć. Nie musimy zajmować się takimi rzeczami, jak LayoutManager, ItemAnimator czy DiffUtil.

Plusy i minusy ListView

Plusy:

  • proste użycie
  • domyślne adaptery
  • dostępny OnItemClickListener
  • to podstawa ExpandableListView

Cons:

  • nie obejmuje użycia wzorca ViewHolder

0

Istnieje wiele różnic między ListView i RecyclerView, ale należy pamiętać o następujących kwestiach:

  • Wzorzec ViewHolder jest całkowicie opcjonalny w ListView, ale jest upieczony w RecyclerView.
  • ListView obsługuje tylko przewijanie w pionie, ale RecyclerView nie ogranicza się do list przewijanych w pionie.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.