Чи слід використовувати RecyclerView для заміни ListView?


232

Документи Android говорять:

Віджет RecyclerView - це більш вдосконалена і гнучка версія ListView. Цей віджет є контейнером для відображення великих наборів даних, які можна прокручувати дуже ефективно, підтримуючи обмежену кількість переглядів. Використовуйте віджет RecyclerView, коли у вас є колекції даних, елементи яких змінюються під час виконання на основі дії користувача або мережевих подій

Насправді ListViewможна зробити все вищезазначене, якщо ефективність не має значення, і ми знайшли багато проблем, коли використовуємо RecyclerViewдля заміни ListView:

  1. Там немає onItemClickListener () для вибору елемента списку - рішення

  2. Немає роздільника між елементами списку - рішення

  3. Немає вбудованого селектора перекриття, немає візуального відгуку при натисканні на пункт списку - рішення

  4. Немає addHeaderView для заголовка списку - рішення

Можливо, більше питань ...

Отже, коли ми використовуємо RecyclerViewдля заміни ListView, нам потрібно зробити багато додаткового кодування, щоб досягти такого ж ефекту, як і ListView.

ПИТАННЯ:

  • Чи варто ми замінити ListViewз RecyclerViewповністю?
  • якщо ні, то в якому випадку нам краще використовувати RecyclerViewзамість цього ListView, і навпаки?

9
ваша тема - це лише перший випуск, і це не моє запитання
Xcihnegn

3
Зауважте лише, що ви повинні використовувати рециркулятор, якщо вам цікаво використовувати згорнуту панель дій. medium.com/android-bites/…
франкас

вам слід використовувати recilerview, оскільки він пропонує більше контролю, ніж перегляд listlist. Це трохи сложно, але ви потрапите туди, тоді ваше життя буде дуже легким, коли ви маєте справу зі списком.
Садашів

3
краще ворог добра.
старший рік

Відповіді:


118

Якщо ListView працює для вас, немає ніяких причин мігрувати. Якщо ви пишете новий інтерфейс, вам може бути краще з RecyclerView.

RecyclerView є потужним, коли вам потрібно налаштувати свій список або вам потрібна краща анімація. Ці зручні методи у ListView завдали чимало клопоту людям, тому RecyclerView пропонує більш гнучкі рішення для них.

Основна зміна, яку потрібно внести для міграції, полягає у вашому адаптері. Якщо ви хочете продовжувати дзвінки notifyDataSetChanged, ви втрачаєте більшість переваг анімації та прив’язки. Але якщо ви можете змінити адаптер для відправки детальних подій сповіщення (додано / видалено / переміщено / оновлено), тоді ви отримаєте набагато кращі анімації та продуктивність. Ці події дозволяють RecyclerView вибирати правильну анімацію, а також допомагає уникнути зайвих onBindдзвінків. Ви отримаєте величезну користь, якщо перегляди ваших предметів складні. Крім того, вперед, навколо RecyclerView буде більше компонентів.


2
Якби я міг тобі дати 100 грошей, я би. notifyDataSetChanged()Метод був причиною мого , RecyclerViewщоб просити нове ViewHoldersвесь час, потрошать переваги ViewHolderшаблону. Шукаючи рішення, я знайшов ваш коментар, який відповідає моїй проблемі майже мимохідь: D дякую!
Прагнув Дев

Я не згоден "Ви отримаєте величезну вигоду, якщо перегляд ваших предметів буде складним", у мене є recilerView, в якому адаптер має 3, якщо інше, Recyclerview працює в моєму випадку погано. Мені довелося відключити переробку з використанням, isRecyclable(false);і кінцевий результат - це дуже млявий RecyclerView. Я навіть не можу змінити це, знадобиться багато часу, щоб повернутися до
списку перегляду

4
люди використовують RV w / багато інших типів, то без будь-яких проблем і хорошої продуктивності. У вашому коді щось інше не так. Слід використати systrace / traceview і подивитися, що відбувається.
yigit

1
@kashyapjimuliya як згадується yigit , 3 if-else цього не повинно викликати. По-перше, ви не згадали, куди поклали ці інше; по-друге, відключення переробки має зробити його повільніше, а не швидше. Чому? Тому що надувати погляд і робити findViewById()це набагато дорожче, ніж робити це ViewHolderтак.
Суфіан

24

На мою думку, якщо ListView відповідає всім поточним потребам вашої програми та задовольняє всі випадки використання, тоді немає необхідності замінювати його RecyclerView.

RecyclerView надає величезну потужність своїм розробникам ціною збільшення складності для розробників. Деякі речі, які можна легко зробити в ListView, тепер можуть зайняти багато зайвих зусиль.

Але так, існує багато речей, які ListView ніколи не може зробити, як дивовижна функція LayoutManager, яка може дозволити вам динамічно змінювати макет на горизонтальну, вертикальну, сітку або поступово розподілену сітку.

Детальну відповідь на цю тему я написав тут .


3
Звичайно, RecyclerView збільшує складність, але, принаймні, реалізує шаблон ViewHolder належним чином для вас.
ІгорГанапольський

@IgorGanapolsky +1 для реалізації схеми ViewHolder.
Sreekanth Karumanaghat

Ви можете написати свій власний шаблон держатель вид просто відмінно з ListView
дан

9

1 Ви можете використовувати інтерфейс, щоб забезпечити прослуховування кліків. Я використовую цю техніку і з ListViews.
2 Немає подільника: Просто додайте в ваш ряд представлений вид з шириною match_parent і висотою 1DP і надати йому колір фону .
3 Просто використовуйте селектор StateList для фону рядка.
4 addHeaderView також можна уникнути і в ListViews: просто поставте заголовка поза View.

Тож, якщо ефективність викликає стурбованість, то так , це гарна ідея замінити ListView на RecyclerView.


19
Це не мої запитання, я мав посилання на кожне вирішення питання
Xcihnegn

6

Я ще недавно все ще використовував ListView для дуже простих списків. Наприклад, якщо я хочу відобразити простий список текстових параметрів ...

Я базував це рішення на "людських факторах", що створити простий ListView з меншим кодом краще, якщо продуктивність не має значення. Я часто думаю про професора в коледжі, який любив говорити: "Мій учитель великий Ніклаус Вірт, винахідник Паскаля, казав, що якщо в програмі більше 50 рядків коду, це, безумовно, помиляється ..."

Але те, що переконало мене припинити використання ListView, це те, що його нещодавно було перенесено в категорію "Спадщина" в інструменті дизайну Android Studio разом з RelativeLayout.

https://developer.android.com/reference/android/widget/ListView

Я думаю, що це "м'яка" форма "знецінення". Це було б занадто руйнівно, якби він був фактично застарілим, і всі сумлінні розробники перенесли свій код на RecyclerView.

Крім того, вступ до ListView попереджає прямо вгорі, що RecyclerView є кращим варіантом: "Для більш сучасного, гнучкого та ефективного підходу до відображення списків використовуйте RecyclerView."
https://developer.android.com/reference/android/widget/ListView

Крім того, посібник по ListView все ще говорить про завантажувачі курсорів, але тоді getSupportCursorLoader () щойно застаріло в API 28.
https://developer.android.com/guide/topics/ui/layout/listview

Останні вдосконалення для Android Studio:

Файл -> Новий -> Фрагмент -> Фрагмент (Список)

Це дає нам повністю працюючий RecylerView, заповнений основним текстом. Це позбавляється від моєї останньої реальної причини використання ListView, оскільки зараз так само просто налаштувати базовий RecylerView.

Підсумовуючи це, я не збираюсь використовувати ListView взагалі для нової розробки, тому що маркування його "спадщиною" - це за крок від його депресії.


3

Єдиний випадок, коли все ще нормально використовувати ListView, це коли список не динамічний або не впливає на мережеві події. Наприклад: навігація.

Для будь-якого іншого використання RecyclerView затемнює ListView. Оскільки RecyclerView піклується лише про переробку, буде простіше робити візуально пов'язані речі, які були щільно поєднані в ListView, як-от зміна положення / перестановки, анімація (насправді це поставляється з RecyclerView.ItemAnimator), спеціальні макети (акція має StaggeredGrid на додаток до старий стиль списку або сітки, але є також ця бібліотека, яка ще більше розширює його).

Крім того, якщо ви хочете використовувати CardView, я вважаю, що це єдиний шлях (трохи добре читати, коли використовувати карту чи список).


Ви маєте на увазі захоплення списку даних із серверів, а потім зберігаються у sqlite на телефоні для використання у відображенні списку (скажімо, ваші послідовники), краще використовувати перегляд переробника, ніж перегляд списку з власником перегляду ?
Lion789

Так. Але якщо бути точним, я більше не бачу жодної ролі для ListView, крім навігації, і це тому, що я вважаю надмірним використовувати RecyclerView там.
inmyth

2

Чудовою альтернативою є використання BaseAdapter. Він підтримує схему використання Viewholder, і моя містить 100+ рядків з растровими зображеннями та кнопками, і вона працює дуже гладко.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.