1. Перегляд власників
У ListView запропонований спосіб визначення власників представлення даних пропонував підтримувати посилання на представлення даних. Але це не було примусом. Хоча, не роблячи цього, ListView використовував показ несвіжих даних. Інший головний недолік використання не власників представлень перегляду може спричинити важку операцію пошуку представлень ідентифікаторів кожного разу. Це призвело до млявих ListViews.
Ця проблема вирішується в RecylerView шляхом використання класу RecyclerView.ViewHolder. Це одна з головних відмінностей у RecyclerView та ListView. Під час реалізації RecyclerView цей клас використовується для визначення об'єкта ViewHolder, який використовується адаптером для зв'язування ViewHolder з позицією. Ще один момент, який слід зазначити, полягає в тому, що при впровадженні адаптера для RecyclerView надання ViewHolder є обов'язковим. Це робить реалізацію трохи складною, але вирішує проблеми, з якими стикається ListView.
2. Диспетчер макета
Якщо говорити про ListViews, доступний лише один тип ListView, тобто вертикальний ListView. Ви не можете реалізувати ListView з горизонтальною прокруткою. Я знаю, що існують способи реалізації горизонтальної прокрутки, але повірте, вона не була розроблена для роботи таким чином.
Але тепер, коли ми дивимось на Android RecyclerView проти ListView, у нас є підтримка і для горизонтальних колекцій. Насправді він підтримує декілька типів списків. Для підтримки декількох типів списків використовується клас RecyclerView.LayoutManager. Це щось нове, що у ListView немає. RecyclerView підтримує три типи попередньо визначених менеджерів макета:
LinearLayoutManager - це найпоширеніший диспетчер макетів у випадку RecyclerView. Завдяки цьому ми можемо створювати як горизонтальні, так і вертикальні списки прокрутки. StaggeredGridLayoutManager - за допомогою цього менеджера макетів ми можемо створювати поетапні списки. Так само, як екран Pinterest. GridLayoutManager - Цей менеджер макетів може використовуватися для відображення сіток, як і будь-яка галерея зображень.
3. Аніматор предмета
Анімації в списку - це абсолютно новий вимір, який має нескінченні можливості. У ListView як такому немає спеціальних положень, за допомогою яких можна анімувати, додавати або видаляти елементи. Замість цього пізніше, як Android розвивався ViewPropertyAnimator був запропонований Chet Haase від Google у цьому відеоуроці для анімації в ListView.
З іншого боку, порівнюючи Android RecyclerView та ListView, він має клас RecyclerView.ItemAnimator для обробки анімації. За допомогою цього класу можуть бути визначені спеціальні анімації для подій додавання, видалення та переміщення. Крім того, він пропонує DefaultItemAnimator, якщо вам не потрібні будь-які налаштування.
4. Перехідник
Адаптери ListView прості у виконанні. У них був основний метод getView, де відбувалася вся магія. Де погляди були прив'язані до позиції. Також у них був цікавий метод registerDataSetObserver, де можна встановити спостерігача прямо в адаптері. Ця функція також присутня в RecyclerView, але для неї використовується клас RecyclerView.AdapterDataObserver. Але суть на користь ListView полягає в тому, що він підтримує три реалізації за замовчуванням адаптерів:
ArrayAdapter CursorAdapter SimpleCursorAdapter У той час як RecyclerView адаптер має всі функції, які мали адаптери ListView, за винятком вбудованої підтримки DB-курсорів та ArrayLists. В RecyclerView.Adapter зараз ми маємо зробити власну реалізацію для подачі даних в адаптер. Так само, як BaseAdapter робить для ListViews. Хоча, якщо ви хочете дізнатися більше про реалізацію адаптера RecyclerView, зверніться до прикладу Android RecyclerView.
5. Повідомлення про зміну даних
Під час роботи з ListView, якщо набір даних змінено, вам потрібно поновити метод notifyDataSetChanged базового адаптера для оновлення даних. Або встановіть для методу setNotifyOnChange значення true, якщо ви хочете автоматично викликати метод notifyDataSetChanged. Але в обох випадках вихід у списку дуже важкий. В основному він оновлює погляди списку.
Але навпаки, у адаптері RecyclerView, якщо один елемент чи діапазон елементів змінилися, існують методи відповідного повідомлення про зміну. Вони є notifyItemChanged і notifyItemRangeChanged відповідно і багато інших подібних:
notifyItemInsterted notifyItemMoved notifyItemRangeInsterted notifyItemRangeRemoved І звичайно, він має оригінальний метод оновити весь список, тобто notifyDataSetChanged, який повідомляє про адаптований цілий набір даних змінився.
6. Прикраса предмета
Щоб відобразити спеціальні роздільники у ListView, можна було легко додати ці параметри до XML ListView:
XHTML android: delier = "@ android: color / transparent" android: delierHeight = "5dp" 1 2 android: delier = "@ android: color / transparent" android: delierHeight = "5dp" Цікава частина Android RecyclerView: на даний момент він не показує роздільник між елементами за замовчуванням. Хоча хлопці з Google, мабуть, навмисно це покинули. Але це значно збільшує зусилля для розробника. Якщо ви хочете додати роздільник між елементами, можливо, вам доведеться виконати спеціальну реалізацію за допомогою класу RecyclerView.ItemDecoration.
Або ви можете застосувати хак, скориставшись цим файлом з офіційних зразків: DividerItemDecoration.java
7. OnItemTouchListener
Перегляди списків, які використовуються для простої реалізації для виявлення кліків, тобто за допомогою інтерфейсу AdapterView.OnItemClickListener.
Але з іншого боку, інтерфейс RecyclerView.OnItemTouchListener використовується для виявлення сенсорних подій в Android RecyclerView. Це трохи ускладнює реалізацію, але дає більший контроль розробнику щодо перехоплення сенсорних подій. В офіційній документації зазначено, що це може бути корисно для маніпуляцій з жестом, оскільки воно перехоплює сенсорну подію, перш ніж вона буде доставлена RecyclerView.
RecyclerView
набагато швидше і універсальніше з набагато кращим API. Такі речі, як анімація додавання або вилучення елементів, вже реалізовані в тому, щоRecyclerView
вам нічого не потрібно робити. Про це не йдеться, киньте йогоListView
в сміттєвий контейнер,RecyclerView
є тут, щоб вкрасти шоу.