Android Recyclerview vs ListView z Viewholder
Ostatnio natknąłem się na Androida RecycleView
, który został wydany z Androidem 5.0 i wydaje się, że RecycleView
jest tylko zamkniętą tradycyjną ListView
z wbudowanym wzorem Viewholdera, który promuje ponowne użycie widoku, a nie tworzenie go za każdym razem.
Jakie są inne korzyści z używania RecycleView
?
Jeśli oba mają ten sam efekt pod względem wydajności, dlaczego warto użyć RecycleView'`
Edit
I found that ludzie zadali podobne pytanie, A odpowiedzi nie są rozstrzygające, dodając je tutaj do przechowywania dokumentacji.
5 answers
Wraz z pojawieniem się Androida Lollipop, RecyclerView pojawił się oficjalnie. RecyclerView jest o wiele bardziej wydajny, elastyczny i znacznie bardziej rozbudowany niż ListView . Postaram się dać Ci szczegółowy wgląd w to.
1) ViewHolder Pattern
W widoku listy zalecano użycie wzorca ViewHolder, ale nigdy nie było to przymusem. W przypadku RecyclerView jest to obowiązkowe przy użyciu RecyclerView.Viewholder class. To jest jedna z głównych różnic między ListView a Recycleview.
Sprawia, że sprawy są nieco bardziej złożone w RecyclerView, ale wiele problemów, z którymi mieliśmy do czynienia w ListView, jest rozwiązywanych skutecznie.
2) LayoutManager
To kolejne potężne ulepszenie wprowadzone do RecyclerView. W widoku listy jedynym dostępnym typem widoku jest pionowy widok listy. Nie ma oficjalnego sposobu na zaimplementowanie poziomego widoku listy.
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 Pinteresta jak listy rozłożone,
Iii) GridLayoutManager - który obsługuje wyświetlanie siatek w aplikacjach galerii.
A najlepsze jest to, że możemy to wszystko robić dynamicznie, jak chcemy.
3) Item Animator
ListViews brakuje wsparcia dla dobre animacje, ale RecyclerView nadaje mu zupełnie nowy wymiar. Korzystanie z RecyclerView .Klasa ItemAnimator , animowanie widoków staje się bardzo łatwe i intuicyjne.
4) Element Dekoracyjny
W przypadku ListViews, dynamiczne dekorowanie elementów, takich jak dodawanie obramowań lub dzielników, nigdy nie było łatwe. Ale w przypadku RecyclerView, RecyclerView.Klasa ItemDecorator daje ogromną kontrolę programistom, ale sprawia, że rzeczy są nieco bardziej czasochłonne i złożone.
5) OnItemTouchListener
Przechwytywanie kliknięć pozycji na ListView było proste, dzięki adapterview.Interfejs OnItemClickListener. Jednak RecyclerView daje znacznie więcej mocy i kontroli swoim twórcom dzięki RecyclerView.OnItemTouchListener ale to trochę komplikuje sprawy dla dewelopera.
W prostych słowach, RecyclerView jest znacznie bardziej konfigurowalny niż ListView i daje dużo kontroli i mocy do jego deweloperzy.
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-07-03 06:03:19
Ok więc trochę kopania i znalazłem te perełki z Bill Philips Artykuł na RecycleView
RecyclerView może zrobić więcej niż ListView, ale Klasa RecyclerView sam ma mniej obowiązków niż ListView. Po wyjęciu z pudełka, RecyclerView nie:
- pozycjonowanie elementów na ekranie
- Animuj widoki
- obsługuj wszelkie zdarzenia dotykowe poza przewijaniem
Wszystkie te rzeczy zostały upieczone w ListView, ale RecyclerView wykorzystuje klasy kolaborantów do wykonywania tych zadań.
Wyświetlacze, które tworzysz, są również bardziej wytrzymałe. Podklasują
RecyclerView.ViewHolder
, który ma kilka metodRecyclerView
zastosowania.ViewHolders
wiedzą, do której pozycji są obecnie przywiązani, jako oraz jakie identyfikatory przedmiotów (jeśli je posiadasz). W procesie,ViewHolder
został szlachcicem. Kiedyś zadaniem ListView było trzymanie się cały widok przedmiotu, aViewHolder
trzymany tylko na małych jego kawałkach.Teraz, ViewHolder trzyma się wszystko w
ViewHolder.itemView
pole, które jest przypisane w konstruktorze Viewholdera dla Ciebie.
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-15 15:15:46
Drugim plusem używania RecycleView
jest animacja, można ją wykonać w dwóch liniach kodu
RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator();
recyclerView.setItemAnimator(itemAnimator);
Ale widżet jest nadal surowy, np. nie można utworzyć nagłówka i stopki .
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-28 14:22:38
Więcej z artykułu Billa Phillipa (Czytaj!), ale uznałem, że ważne jest, aby wskazać następujące
W ListView pojawiły się pewne niejasności dotyczące obsługi zdarzeń kliknięć: czy poszczególne widoki powinny obsługiwać te zdarzenia, czy ListView powinien obsługiwać je przez OnItemClickListener? Jednak w RecyclerView, ViewHolder jest w wyraźnej pozycji, aby działać jako obiekt kontrolera na poziomie wiersza, który obsługuje tego rodzaju szczegóły.
Widzieliśmy wcześniej ten LayoutManager obsługiwał widoki pozycjonowania, a ItemAnimator zajmował się ich animowaniem. ViewHolder jest ostatnim elementem: jest odpowiedzialny za obsługę wszelkich zdarzeń, które występują na określonym elemencie, który wyświetla 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
2015-02-19 15:40:45
Użyłem {[0] } z Glide image loader, o wzroście pamięci. Następnie zamieniłem ListView
na RecyclerView
. Jest to nie tylko trudniejsze w kodowaniu, ale również prowadzi do większego wykorzystania pamięci niż ListView
. Przynajmniej w moim projekcie.
W innym ćwiczeniu użyłem złożonej listy z EditText's
. W niektórych z nich metoda wprowadzania może się różnić, można również zastosować TextWatcher
. Jeśli użyłem ViewHolder
, Jak mogę zastąpić TextWatcher
podczas przewijania? Więc użyłem ListView
bez ViewHolder
i działa.
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-28 13:57:45