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.
Powyższe zdjęcie można łatwo utworzyć za pomocą ListView
z niestandardowym adapterem.
Więc, w jakiej sytuacji należy użyć RecyclerView
?
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:
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.
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));
- 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.
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.
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 wListView
, 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 wzorcaViewHolder
wListViews
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ć tradycyjneListView
, Jak pokazano powyżej, a także rzeczy takie jakGridView
, 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.
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ępcaListView and GridView
, i można go znaleźć wlatest support-v7 version
. NaRecyclerView
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ę.
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.
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
.
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.
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:
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.
Przełączanie między siatką a listą jest teraz łatwiejsze dzięki LayoutManager.
Nie ma potrzeby powiadamiania i aktualizowania wszystkich elementów, nawet jeśli zmieniany jest tylko jeden element.
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.)
Bardzo proste animacje przedmiotów w przypadku RV.
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
.
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
.
Oczywiście, oba używają
ViewHolders
, więc nie jest to zaleta.A
RecyclerView
jest trudniejsze w kodowaniu.A
RecyclerView
nie zawiera nagłówka i stopki, więc jest to minus.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.
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
- możesz użyć interfejsu, aby zapewnić słuchacz kliknięć. Używam tego technika z ListViews, zbyt.
- bez dzielnika: po prostu dodaj w wierszu Widok o szerokości match_parent i wysokości 1dp i nadać mu kolor tła.
- po prostu użyj selektora StateList dla tła wiersza.
- 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.
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:
Domyślnie zawiera ViewHolder.
Łatwe animacje.
-
Obsługuje układy poziome, siatkowe i rozłożone
Zalety listView nad recyclerView:
Łatwo dodać dzielnik.
-
Może używać wbudowanej arrayAdapter dla prostych list
Obsługuje nagłówek i stopkę .
Obsługuje OnItemClickListner .
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:
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