RecyclerView vs. ListView

Od programisty Androida (Tworzenie list i kart):

Widżet RecyclerView jest bardziej zaawansowaną i elastyczną wersją ListView.
Ok, brzmi fajnie, ale kiedy zobaczyłem to przykładowe zdjęcie, bardzo się pogubiłem co do różnicy między nimi.

Tutaj wpisz opis obrazka

Powyższe zdjęcie można łatwo utworzyć za pomocą ListView z niestandardowym adapterem.

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

Author: chewbapoclypse, 2014-11-04

13 answers

RecyclerView został stworzony jako ulepszenie ListView, więc tak, możesz utworzyć dołączoną listę za pomocą kontrolki ListView, ale korzystanie z RecyclerView jest łatwiejsze:

  1. Ponowne wykorzystanie komórek podczas przewijania w górę/w dół - jest to możliwe przy implementacji uchwytu widoku w adapterze listView, ale było to opcjonalne, podczas gdy w RecycleView jest to domyślny sposób zapisu adaptera.

  2. Oddzielenie listy od jej kontenera - dzięki czemu można umieścić elementy listy łatwo w czasie pracy w różnych kontenerach (linearLayout, gridLayout) z ustawieniem LayoutManager .

przykład:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
  1. animuje akcje common list - animacje są oddzielone od siebie i delegowane do ItemAnimator .

Jest więcej o RecyclerView, ale myślę, że te punkty są najważniejsze.

Podsumowując, RecyclerView jest bardziej elastyczną kontrolą do obsługi "danych listowych", które podążają za wzorcami delegowania obaw i pozostawia sobie tylko jedno zadanie-recykling przedmiotów.

 317
Author: daneejela,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-22 13:32:41

Aby widoki listy miały dobrą wydajność, musisz zaimplementować wzorzec posiadacza, a to łatwo zepsuć, zwłaszcza gdy chcesz wypełnić listę kilkoma różnymi rodzajami widoków.

RecyclerView piecze ten wzór, co utrudnia bałagan. Jest również bardziej elastyczny, co ułatwia obsługę różnych układów, które nie są proste liniowo, jak siatka.

 34
Author: CaptRespect,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-23 20:13:16

ListView jest przodkiem RecyclerView. Było wiele rzeczy, które ListView albo nie wypadły, albo nie wypadły dobrze. Gdybyś zebrał braki ListView i rozwiązał problem poprzez abstrakcję problemów na różne domeny, skończyłbyś z czymś takim jak widok recyclera. Oto główne problemy z ListViews:

  • Nie wymuszono ponownego użycia View dla tych samych typów elementów (spójrz na jeden z adapterów używanych w ListView, jeśli przeanalizujesz metodę getView zobaczysz, że nic nie stoi na przeszkodzie, aby programista stworzył nowy widok dla każdego wiersza, nawet jeśli jest on przekazywany przez zmienną convertView)

  • Nie zapobiegło to kosztownym zastosowaniom findViewById (nawet jeśli recyklingowałeś widoki, jak wspomniano powyżej, programiści mogli wywoływać findViewById, aby zaktualizować wyświetlaną zawartość widoków potomnych. Głównym celem wzorca ViewHolder w ListViews było buforowanie wywołań findViewById. Jednak było to dostępne tylko wtedy, gdy wiedziałeś o tym, ponieważ nie było to częścią platforma w ogóle)

  • Tylko obsługiwane przewijanie pionowe z wyświetlonymi widokami wiersza(Widok Recycler nie obchodzi, gdzie są umieszczone i jak są przenoszone, jest abstrakcyjny do LayoutManager. Recycler może więc obsługiwać tradycyjne ListView, Jak pokazano powyżej, a także rzeczy takie jak GridView, ale nie jest to ograniczone do tego, może zrobić więcej, ale musisz wykonać pracę stopki programistycznej, aby to się stało).

  • Animacje do dodania/usunięcia nie były używane sprawa, która została rozpatrzona. To było całkowicie do ciebie, aby dowiedzieć się, jak to zrobić (porównaj RecyclerView. Adapter classes notify * method offerings V. ListViews to get an idea).

W skrócie RecyclerView jest bardziej elastycznym podejściem do ListView, choć może być konieczne więcej kodowania z twojej strony.

 29
Author: Jim Baca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-23 11:52:48

RecyclerView jest nową ViewGroup, która jest przygotowana do renderowania dowolnych widok oparty na adapterze w podobny sposób. To jest supposed być następca ListView and GridView, i można go znaleźć w latest support-v7 version. Na RecyclerView został opracowany z myślą o rozszerzalności , dzięki czemu możliwe jest tworzenie dowolnego rodzaju układ można wymyślić, ale nie bez odrobiny bólu w dupie dawka.

Odpowiedź zaczerpnięta zAntonio leiva

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

RecyclerView na rzeczywiście a powerful view niż ListView. Aby uzyskać więcej informacji, odwiedź tę stronę.

 19
Author: IntelliJ Amiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-11 06:40:45

Poniżej przedstawiono kilka kluczowych punktów/różnic między RecyclerView i ListView. Odbierz telefon mądrze.

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

RecylerView ma wbudowany ViewHolder, nie musi implementować własnego jak w listView. Wsparcie IT notify at particular index as well

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

Możemy powiązać layout Managera z RecyclerView, może to być używany do uzyskiwania losowych widoków w recycleview, podczas gdy to było ograniczenie w ListView w widoku listy jedynym dostępnym typem widoku jest pionowy widok listy. Nie ma oficjalnego sposobu, aby nawet wdrożyć poziomy widok listy. Teraz używając RecyclerView, możemy mieć

I) LinearLayoutManager-który obsługuje zarówno pionowe jak i poziome list, ii) StaggeredLayoutManager-który obsługuje Pinteresta jak staggered lists, iii) GridLayoutManager-który obsługuje wyświetlanie siatki jak widać w aplikacjach galerii.

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

 15
Author: Pawan Maheshwari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-13 05:16:40

Główna przewaga:

ViewHolder domyślnie nie jest dostępna w ListView. Będziemy tworzyć jawnie wewnątrz getView(). RecyclerView ma wbudowany Viewholder.

 13
Author: Mohammed Imran N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-14 07:05:48

Myślę, że główną i największą różnicą jest to, że ListView szuka pozycji elementu podczas tworzenia lub umieszczania go, z drugiej strony RecyclerView szuka rodzaju elementu. jeśli istnieje inny element utworzony z tego samego typu RecyclerView nie tworzy go ponownie. Najpierw pyta adapter, a następnie pyta o recycledpool, jeśli recycled pool mówi "tak, utworzyłem podobny typ", to RecyclerView nie próbuje utworzyć tego samego typu. ListView nie ma takiego mechanizmu łączenia.

 3
Author: Mustafa Güven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-14 06:44:14

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

  1. RV oddziela Tworzenie widoku i powiązanie danych do wyświetlenia. W LV, musisz sprawdzić, czy convertView jest null, czy nie do tworzenia widoku, przed powiązaniem z nim danych. Tak więc, w przypadku RV, Widok zostanie utworzony tylko wtedy, gdy jest to potrzebne, ale w przypadku LV, można pominąć sprawdzenie convertview i utworzy Widok za każdym razem.

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

  3. Nie ma potrzeby powiadamiania i aktualizowania wszystkich elementów, nawet jeśli zmieniany jest tylko jeden element.

  4. Trzeba było zaimplementować buforowanie widoku w przypadku LV. Domyślnie jest on dostarczany w RV. (Istnieje różnica między buforowaniem widoku n recycling.)

  5. Bardzo proste animacje przedmiotów w przypadku RV.

 3
Author: Virat18,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-06 20:47:25

Moim zdaniem RecyclerView został stworzony, aby rozwiązać problem ze wzorem recyklingu używanym w listviews, ponieważ utrudniał życie deweloperom. Wszystkie inne, z którymi mógłbyś sobie poradzić mniej więcej. Na przykład używam tego samego adaptera dla ListView i GridView to nie ma znaczenia w obu widokach getView, getItemCount, getTypeCount jest używany, więc jest taki sam. RecyclerView nie jest potrzebne, jeśli ListView z ListAdapter lub GridView z adapterów sieciowych już działa dla Ciebie. Jeśli poprawnie zaimplementowałeś wzorzec ViewHolder w swoim listviews wtedy nie zobaczysz żadnej dużej poprawy w stosunku do RecycleView.

 2
Author: aimiliano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-14 06:35:23

Trochę pracowałem z RecyclerView i nadal wolę ListView.

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

  2. A RecyclerView jest trudniejsze w kodowaniu.

  3. A RecyclerView nie zawiera nagłówka i stopki, więc jest to minus.

  4. A ListView nie wymaga tworzenia Viewholdera. W przypadkach, gdy chcesz mieć listę z sekcjami lub nagłówkami, dobrym pomysłem byłoby tworzenie niezależnych pozycji (bez Viewholdera), to łatwiejsze i nie wymaga osobnych klas.

 2
Author: CoolMind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-12 14:29:22
  1. możesz użyć interfejsu, aby zapewnić słuchacz kliknięć. Używam tego technika z ListViews, zbyt.
  2. bez dzielnika: po prostu dodaj w wierszu Widok o szerokości match_parent i wysokości 1dp i nadać mu kolor tła.
  3. po prostu użyj selektora StateList dla tła wiersza.
  4. addHeaderView można również uniknąć w ListViews: po prostu Nagłówek poza widokiem.

Więc, jeśli wydajność jest Twoim problemem, to tak, to dobry pomysł, aby zastąpić Widok listy z RecyclerView.

 1
Author: Jay Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-12 18:27:42

Zalety RecyclerView nad listview:

  1. Domyślnie zawiera ViewHolder.

  2. Łatwe animacje.

  3. Obsługuje układy poziome, siatkowe i rozłożone

Zalety listView nad recyclerView:

  1. Łatwo dodać dzielnik.

  2. Może używać wbudowanej arrayAdapter dla prostych list

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

  4. Obsługuje OnItemClickListner .

 1
Author: Redman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-10 12:19:43

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

Jest ci trudniej, ponieważ myślisz tylko z myślą o Bibliotece Androida.

Dzisiaj istnieje wiele opcji, które pomogą Ci zbudować własne Adaptery, ułatwiając tworzenie list i siatek dynamicznych elementów, które możesz wybierz, Zmień kolejność, użyj animacji, dzielników, dodaj 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 (jak facebook news) w ListView i RecyclerView, zobaczysz różnicę w UX (user experience) podczas próby przewijania, prawdopodobnie aplikacja testowa zatrzyma się, zanim będziesz mógł to zrobić.

Polecam sprawdzić te dwie biblioteki dla ułatwienia Adaptery:

FastAdapter by mikepenz

FlexibleAdapter by dawideas

 0
Author: Erick Moya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-15 02:19:44