1. Zobacz posiadaczy
W ListView zdefiniowanie posiadaczy widoków było sugerowanym podejściem do przechowywania odwołań do widoków. Ale to nie był przymus. Chociaż nie robiąc tego, ListView użył pokazania nieaktualnych danych. Inna poważna wada polegająca na niestosowaniu uchwytów widoków może prowadzić do ciężkiej operacji wyszukiwania widoków za każdym razem za pomocą identyfikatorów. Co spowodowało opóźnienia w ListViews.
Ten problem został rozwiązany w RecylerView za pomocą klasy RecyclerView.ViewHolder. Jest to jedna z głównych różnic w RecyclerView i ListView. Podczas implementowania RecyclerView ta klasa służy do definiowania obiektu ViewHolder, który jest używany przez adapter do wiązania elementu ViewHolder z pozycją. Inną kwestią, na którą należy tutaj zwrócić uwagę, jest to, że podczas implementowania adaptera dla RecyclerView podanie elementu ViewHolder jest obowiązkowe. To sprawia, że implementacja jest trochę skomplikowana, ale rozwiązuje problemy napotykane w ListView.
2. Menedżer układu
Mówiąc o ListViews, dostępny jest tylko jeden typ ListView, tj. Pionowy ListView. Nie można zaimplementować ListView z przewijaniem poziomym. Wiem, że istnieją sposoby na zaimplementowanie przewijania poziomego, ale wierz mi, że nie został zaprojektowany do tego celu.
Ale teraz, gdy spojrzymy na Android RecyclerView i ListView, mamy również obsługę kolekcji poziomych. W rzeczywistości obsługuje wiele typów list. Do obsługi wielu typów list używa klasy RecyclerView.LayoutManager. To jest coś nowego, czego ListView nie ma. RecyclerView obsługuje trzy typy predefiniowanych menedżerów układu:
LinearLayoutManager - jest to najczęściej używany menedżer układu w przypadku RecyclerView. Dzięki temu możemy tworzyć listy przewijania w poziomie i pionie. StaggeredGridLayoutManager - za pomocą tego menedżera układu możemy tworzyć listy schodkowe. Podobnie jak ekran Pinterest. GridLayoutManager - tego menedżera układu można używać do wyświetlania siatek, jak każda galeria obrazów.
3. Animator pozycji
Animacje na liście to zupełnie nowy wymiar, który ma nieskończone możliwości. W ListView jako takie nie ma specjalnych przepisów, za pomocą których można animować, dodawać lub usuwać elementy. Zamiast tego później, gdy Android ewoluował, ViewPropertyAnimator został zasugerowany przez Cheta Haase'a z Google w tym samouczku wideo dla animacji w ListView.
Z drugiej strony, porównując system Android RecyclerView z ListView, ma klasę RecyclerView.ItemAnimator do obsługi animacji. Dzięki tej klasie można zdefiniować niestandardowe animacje dla zdarzeń dodawania, usuwania i przenoszenia elementów. Zapewnia również DefaultItemAnimator, na wypadek, gdybyś nie potrzebował żadnych dostosowań.
4. Adapter
Adaptery ListView były proste w implementacji. Mieli główną metodę getView, w której zdarzała się cała magia. Gdzie widoki były związane z pozycją. Mieli też interesującą metodę registerDataSetObserver, w której można ustawić obserwatora bezpośrednio w adapterze. Ta funkcja jest również obecna w RecyclerView, ale jest do niej używana klasa RecyclerView.AdapterDataObserver. Ale zaletą ListView jest to, że obsługuje trzy domyślne implementacje adapterów:
ArrayAdapter CursorAdapter SimpleCursorAdapter Podczas gdy adapter RecyclerView ma wszystkie funkcje, które miały adaptery ListView, z wyjątkiem wbudowanej obsługi kursorów bazy danych i ArrayLists. W RecyclerView.Adapter od teraz musimy wykonać niestandardową implementację, aby dostarczyć dane do adaptera. Podobnie jak w przypadku BaseAdapter w przypadku ListViews. Chociaż jeśli chcesz dowiedzieć się więcej o implementacji adaptera RecyclerView, zapoznaj się z przykładem RecyclerView systemu Android.
5. Powiadamianie o zmianie danych
Podczas pracy z ListView, jeśli zestaw danych zostanie zmieniony, należy wywołać metodę notifyDataSetChanged adaptera bazowego, aby odświeżyć dane. Lub ustaw metodę setNotifyOnChange na true w przypadku, gdy chcesz automatycznie wywołać metodę notifyDataSetChanged. Ale w obu przypadkach wynik jest bardzo ciężki na liście. Zasadniczo odświeża widoki listy.
Ale wręcz przeciwnie w adapterze RecyclerView, jeśli zmienił się pojedynczy element lub zakres elementów, istnieją metody powiadamiania o zmianie. Są to odpowiednio notifyItemChanged i notifyItemRangeChanged i wiele innych, takich jak:
notifyItemInsterted notifyItemMoved notifyItemRangeInsterted notifyItemRangeRemoved I oczywiście ma oryginalną metodę odświeżania całej listy, tj. notifyDataSetChanged, która powiadamia zaadaptowany cały zestaw danych o zmianie.
6. Dekoracja przedmiotu
Aby wyświetlić niestandardowe separatory w ListView, można łatwo dodać te parametry w ListView XML:
XHTML android: divider = "@ android: color / transparent" android: dividerHeight = "5dp" 1 2 android: divider = "@ android: color / transparent" android: dividerHeight = "5dp" Interesującą częścią Android RecyclerView jest to, na razie nie wyświetla domyślnie podziału między elementami. Chociaż pracownicy Google celowo musieli to pominąć w celu dostosowania. Ale to znacznie zwiększa wysiłek programisty. Jeśli chcesz dodać separator między elementami, może być konieczne wykonanie niestandardowej implementacji przy użyciu klasy RecyclerView.ItemDecoration.
Możesz też zastosować hack, używając tego pliku z oficjalnych przykładów: DividerItemDecoration.java
7. OnItemTouchListener
Listviews miało prostą implementację do wykrywania kliknięć, np. Przy użyciu interfejsu AdapterView.OnItemClickListener.
Ale z drugiej strony interfejs RecyclerView.OnItemTouchListener służy do wykrywania zdarzeń dotykowych w systemie Android RecyclerView. Trochę komplikuje implementację, ale daje deweloperowi większą kontrolę nad przechwytywaniem zdarzeń dotykowych. Oficjalna dokumentacja stwierdza, że może być przydatna do manipulacji gestami, ponieważ przechwytuje zdarzenie dotykowe przed dostarczeniem do RecyclerView.
RecyclerView
jest znacznie szybszy i bardziej wszechstronny z dużo lepszym interfejsem API. Rzeczy takie jak animowanie dodawania lub usuwania elementów są już zaimplementowane w programieRecyclerView
bez konieczności wykonywania jakichkolwiek czynności. Nie ma co do tego wątpliwości, wyrzuć swojeListView
do kosza na śmieci,RecyclerView
jest tu po to, żeby ukraść przedstawienie.