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.

Recyclerview vs Listview

Czy powinniśmy użyć RecyclerView do zastąpienia ListView?

Dlaczego RecyclerView nie ma funkcji onItemClickListener ()? czym RecyclerView różni się od Listview?

Author: Community, 2015-02-15

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.

 236
Author: Aritra Roy,
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 metod RecyclerView 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, a ViewHolder 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.

 8
Author: Mushtaq Jameel,
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 .

 8
Author: Etun,
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.

 4
Author: Jaison Brooks,
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.

 3
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-09-28 13:57:45