RecyclerView проти ListView


295

Від розробника Android ( створення списків і карток ):

Віджет RecyclerView - це більш вдосконалена і гнучка версія ListView.

Гаразд, це звучить круто, але коли я побачив цю прикладну картину, я дуже розгубився щодо різниці між цими двома.

введіть тут опис зображення

Зображення вище можна легко створити за ListViewдопомогою спеціального адаптера.

Отже, в якій ситуації слід користуватися RecyclerView?



1
@ Dev786: Я пропоную вам додати коментар, де детально пояснюється, що, на вашу думку, не вистачає з багатьох існуючих відповідей на це питання.
CommonsWare

Відповіді:


374

RecyclerViewстворено як ListViewполіпшення, так що так, ви можете створити доданий список з ListViewкеруванням, але використовувати RecyclerViewце простіше:

  1. Повторно використовує клітинки під час прокрутки вгору / вниз - це можливо, застосувавши View Holder в ListViewадаптер, але це було необов'язково, тоді як RecycleViewце стандартний спосіб запису адаптера.

  2. Розв'язує список від свого контейнера - так ви можете легко розміщувати елементи списку під час виконання роботи в різних контейнерах (linearLayout, gridLayout) з налаштуванням LayoutManager.

Приклад:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
  1. Анімує спільні дії зі списку - анімації розв'язуються та делегуються ItemAnimator.

Про це є більше RecyclerView, але я думаю, що ці моменти є основними.

Отже, підсумовуючи, RecyclerViewє більш гнучким контролем поводження з "переліковими даними", який слід за зразками делегування проблем і залишає для себе лише одне завдання - переробку предметів.


16
Основна відповідальність перегляду списку полягає у 1.) візуальному розташуванні предметів у межах даної області та бажано 2.) повторному використанні предметів. Завдяки RecylerView ця функція розподіляється на одну відповідальність - переробляйте перегляд рециклів, і LayoutManager впорядковує елементи на екрані. Іншими словами, перегляд утилізації не знає / не важливо, де розмістити предмети на екрані, він просто піклується про їх переробку. Від андроїд doc: "Змінюючи LayoutManager, RecyclerView може бути використаний для впровадження стандартного вертикально прокручуваного списку, рівномірної сітки, ступінчастої сітки, горизонтальної прокрутки колекцій та ін."
daneejela

32
"Повторне використання комірок під час прокрутки вгору / вниз": Наскільки я знаю, це абсолютно неправильно, оскільки це відбувається навіть у перегляді списку без переглядача.
Рубан

16
Основне використання власника представлення даних у перегляді списку - Ваш код може викликати findViewById () часто під час прокрутки ListView, що може уповільнити продуктивність. Навіть коли адаптер повертає завищений вигляд для переробки, вам все одно потрібно шукати елементи та оновлювати їх. Шляхом неодноразового використання findViewById () є використання шаблону дизайну "власника перегляду". Об'єкт ViewHolder зберігає кожен з представлених компонентів всередині тегу поля Макет, тож ви можете негайно отримати доступ до них без необхідності їх повторного пошуку.
Рубан

7
Що я намагаюся сказати, це те, що рядок буде перероблено, навіть якщо ви реалізуєте listview без власника перегляду. Це властивість і перевага списку перегляду. Саме цим вони створили перегляд списку.
Рубан

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

39

Щоб перегляди списку мали хорошу ефективність, вам потрібно буде застосувати схему власника, і це легко зіпсувати, особливо коли ви хочете заповнити список кількома різними видами переглядів.

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


6
Так ! , повинно бути більше дискусій про те, коли НЕ використовувати також recilerview. Якщо у ваших рядках динамічно додається вміст на основі даних моделі, і ви використовуєте перегляд Recycler, BOOM.
Рана Глибока

1
Ви повинні мати можливість додавати динамічний контент на основі даних моделі. Вам просто знадобиться налаштувати різні представлення для будь-якого типу вмісту, який ви хочете підтримувати.
CaptRespect

36

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

  • Не застосовували Viewповторне використання для тих самих типів елементів (подивіться один з адаптерів, які використовуються в ListView, якщо ви вивчаєте метод getView, ви побачите, що ніщо не заважає програмісту створити новий вигляд для кожного рядка, навіть якщо він переданий у через convertViewзмінну)

  • Не перешкоджало дорогому findViewByIdвикористанню (Навіть якщо ви переробляли перегляди, як зазначено вище, розробники могли викликати findViewByIdоновлення відображеного вмісту дочірніх переглядів. Основна мета ViewHolderшаблону в ListViews- кешувати findViewByIdдзвінки. Однак це було лише доступно, якщо ви про це знали, оскільки він взагалі не був частиною платформи)

  • Підтримується лише вертикальна прокрутка з відображенням рядків (у режимі Recycler не важливо, де розміщуються представлення даних і як вони переміщуються, він абстрагується в а LayoutManager. Рециклінг може підтримувати традиційне, ListViewяк показано вище, а також такі речі, як GridView, але він не обмежується цим, він може зробити більше, але ви повинні виконати роботу програмування ніг, щоб це сталося).

  • Анімації, які додаються / видаляються, не вважалися випадком використання. Ви повністю вирішили розібратися з цим питанням (порівняйте RecyclerView. Класи адаптерів повідомляють * пропозиції методів v. ListViews, щоб отримати уявлення).

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


20

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

Відповідь взята з Антоніо лейва

 compile 'com.android.support:recyclerview-v7:27.0.0'

RecyclerViewсправді є powerful viewчим ListView. Для отримання більш детальної інформації ви можете відвідати цю сторінку .


5
Мені подобається це речення з вашої відповіді: Це Android, тому речі ніколи не бувають простими. Це правда для розробки програм для Android, але я думаю, що це щось не так у тому, як вони розробили API, а також моделі побудови. Додаток для Android Теоретично, хороший дизайн повинен приховувати всі можливі складності від програмістів (але все-таки бути доступними для просунутих), що їх зазвичай хвилює - це бізнес-логіка, дані та інші алгоритми, окрім як боротися з вирішенням проблем, пов’язаних із користувальницьким інтерфейсом (та більш важких проблем, які зараз є в розробці Android).
Безнадійні

18

Нижче наведено кілька ключових моментів / відмінностей між RecyclerView & ListView. Прийміть свій дзвінок з розумом.

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

RecylerView має вбудований ViewHolder, не потрібно реалізовувати власне, як у listView. Він підтримує сповіщення і за певним індексом

Такі речі, як анімація додавання або видалення елементів, вже реалізовані в RecyclerView, без цього вам нічого робити

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

i) LinearLayoutManager - який підтримує як вертикальний, так і горизонтальний списки; ii) StaggeredLayoutManager - який підтримує Pinterest, подібно до ступінчастих списків; iii) GridLayoutManager - який підтримує відображення сіток, як це бачиться в додатках галереї.

І найкраще, що ми можемо робити все це динамічно, як хочемо.


14

Основна перевага:

ViewHolderнедоступно за замовчуванням у ListView. Ми будемо створювати явно всередині getView(). RecyclerViewвбудований Viewholder.


4

Крім перерахованих вище відмінностей, ще декілька:

  1. RV розділяє створення перегляду та прив'язку даних для перегляду. У LV, перш ніж прив’язувати дані до нього, потрібно перевірити, чи ConverView є нульовим чи ні для створення представлення даних. Так, у випадку RV, перегляд буде створено лише тоді, коли це потрібно, але у випадку НН, ви можете пропустити перевірку на перегляд перегляду та створити перегляд кожного разу.

  2. Перехід між сіткою та списком тепер простіший за допомогою програми LayoutManager.

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

  4. Треба було застосувати кешування перегляду у випадку НН. Він надається в RV за замовчуванням. (Є різниця між кешуванням перегляду n переробкою.)

  5. Дуже проста анімація предметів у випадку RV.


4

Переваги RecyclerView над списком перегляду:

  1. За замовчуванням містить ViewHolder.

  2. Легка анімація.

  3. Підтримує горизонтальні, сітчасті та поетапні макети

Переваги listView перед вторинним переглядом:

  1. Легко додати роздільник.

  2. Можна використовувати вбудований arrayAdapter для простих простих списків

  3. Підтримується колонтитул і колонтитул.

  4. Підтримує OnItemClickListner.


4
Наскільки я розумію, ви можете легко додати роздільник до recilerlerView, використовуючи recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));щось на зразокrecyclerView = view.findViewById(R.id.feed);
nviens

1
@nviens Для перегляду списку ви можете додати роздільник, відрегулювати його висоту та змінити колір у самому xml. Також поточна реалізація для дільника просто нормальна. Був кошмаром раніше додати дільник для перегляду перегляду, просто перевірте цю відповідь, щоб побачити, як попередня реалізація для дільника була stackoverflow.com/a/27037230/6478047
Manohar Reddy

4

8 Відмінності між RecyclerView та ListView

Recyclerview проти ListView

1. ViewHolder Pattern

Шаблон, що використовується для зменшення викликів до методів findViewById () .

У ListView ви можете легко створити список, не використовуючи ViewHolder. Але не у випадку RecyclerView.

2. Перехідник

Обидва вони є AdapterViews, так. Він працює на основі класу адаптерів.

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

Ви не можете використовувати ArrayAdapter або будь-який інший вбудований адаптер з RecyclerView.

3. Розташування предметів

Я створив Vertical ListView у простому та меншому коді. Але що робити, якщо нам потрібно створити GridView?

RecyclerView використовує LayoutManager для організації своїх елементів. Є 3 класи LayoutManager.

  • LinearLayoutManager - допомагає створити лінійний список типів.
  • GridLayoutManager - використовується для створення Grid.
  • StaggeredGridLayoutManager - використовується для створення staggeredgrid.

Анімації

У ListView бракує основних анімацій. Але RecyclerView поставляється з простими анімаціями.

Дільник

Андроїд: дільник і Android: dividerHeight атрибути або setDivider (), setDividerHeight () дозволяє зробити користувальницький дільник в ListView.

з 25.1.0 ви можете використовувати клас DividerItemDecoration, щоб зробити простий дільник.

Клацніть Події

RecyclerView бракує OnItemClickListener , так, це дуже сумно. Але вони надають більше контролю розробнику, надаючи RecyclerView.OnItemTouchListener.

Повідомте методи

Вам потрібно зателефонувати у відповідні методи сповіщення *, щоб виконати правильну анімацію. RecylcerView має безліч методів сповіщення * у порівнянні з ListView.


3

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


2

На мою думку, RecyclerViewбуло вирішено проблему із схемою переробки, що використовується у переглядах списку, оскільки це ускладнювало життя розробника. Всі інші, з якими ви могли впоратися більш-менш. Наприклад я використовую той же адаптер для ListViewі GridViewце не має значення в обох виставах про getView, getItemCount, getTypeCountвикористовується так це те ж саме. RecyclerViewне потрібен, якщо ListViewз ListAdapterабо GridViewз адаптерами сітки вже працює для вас. Якщо ви правильно реалізували ViewHolderсхему у своїх переглядах списку, ви не побачите жодного великого поліпшення RecycleView.


2

Я трохи працював RecyclerViewі все ще віддаю перевагу ListView.

  1. Звичайно, вони обидва використовують ViewHolders, тому це не є перевагою.

  2. A RecyclerViewскладніше в кодуванні.

  3. RecyclerViewНе містить верхні і нижні колонтитули, таким чином , це мінус.

  4. A ListViewне потрібно робити ViewHolder. У випадках, коли ви хочете мати список із розділами чи підзаголовками, було б непогано зробити самостійні елементи (без ViewHolder), це простіше і не потребує окремих класів.


1
ви можете зробити заголовки та вміст у адаптері reciklierview, і він буде більш гнучким, ніж listview. просто важко змінити ур список списку перегляду на recilerview, але якщо ви зможете це зробити, ви зрозумієте, що я означаю.listview застарілий просто перейдіть на спробу навчитися
recilerview

2
@erginduran, я використовував обидва. ListView досі широко використовується і не застарілий. Також він витрачає менше пам'яті, ніж RecyclerView. Якщо ви хочете лише замінити ListView на RecyclerView, це не буде хорошою ідеєю.
CoolMind

просто перевірте, для чого хлопці розробили рециркулятор? її поліпшення перегляду списків, правда? У Google play є багато старих ліб та додатків, тому ви маєте рацію listview, як і раніше, широко використовується. Просто залиште старі речі в минулому. перевірити порівняння -> посилання
erginduran

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

Я додав деякі аспекти до цієї теми, див. Stackoverflow.com/a/39721769/2914140 .
CoolMind

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

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


0

Проста відповідь: Ви повинні використовувати RecyclerView в ситуації, коли ви хочете показати багато елементів, а кількість їх динамічна. ListView слід використовувати лише тоді, коли кількість елементів завжди однакова і обмежена розміром екрана.

Вам важче, тому що ви думаєте просто з урахуванням бібліотеки Android.

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

Не лякайтеся і не спробуйте RecyclerView, ви можете почати любити його, роблячи список зі 100 предметів, завантажених з Інтернету (наприклад, новини з Facebook) у ListView та RecyclerView, ви побачите різницю в UX (користувачі при спробі прокрутки, ймовірно, тестовий додаток зупиниться, перш ніж ви навіть зможете це зробити.

Я рекомендую вам перевірити ці дві бібліотеки для створення легких адаптерів:

FastAdapter від mikepenz

ГнучкийAdapter від davideas


1
Я вважаю, що ваші твердження про різницю у виконанні між цими двома перебільшені. Я використовую ListView у виробничому додатку з 2012 року, відображаючи до 3000 елементів із ~ 10 різними переглядами в кожному рядку, абсолютно не виникає проблем з ефективністю навіть на старих пристроях Android 2.3.
Магнус Ш

0

RecyclerView інформація

Представлено RecyclerViewс Android 5.0 (Lollipop). він включений до бібліотеки підтримки . Таким чином, він сумісний з Android API рівня 7.

Точно так же до ListView, RecyclerView’sосновна ідея полягає в тому, щоб забезпечити лістинг функціональності в продуктивності дружній манері. Частина "Переробник" назви цього погляду не є збігом обставин. Фактично RecyclerViewможна переробити предмети, з якими зараз працює. Процес переробки здійснюється завдяки шаблону під назвою Держатель перегляду .

Плюси і мінуси RecyclerView

Плюси:

  • інтегрована анімація для додавання, оновлення та видалення елементів
  • примушує переробляти перегляди за допомогою шаблону ViewHolder
  • підтримує і сітки, і списки
  • підтримує вертикальне та горизонтальне прокручування
  • може використовуватися разом з DiffUtil

Мінуси:

  • додає складності
  • немає OnItemClickListener

ListView інформація

Це ListViewбуло з самого початку Android. Він був доступний навіть у, API Level 1і він має ту саму мету, що і RecyclerView.

Використання ListView насправді дуже просто. У цьому аспекті це не так, як його наступник. Крива навчання плавніша, ніж для RecyclerView. Таким чином, легше зрозуміти. Нам не доводиться мати справу з такими речами, як LayoutManager, ItemAnimator або DiffUtil.

Плюси і мінуси ListView

Плюси:

  • просте використання
  • адаптери за замовчуванням
  • доступний OnItemClickListener
  • це фундамент ExpandableListView

Мінуси:

  • не охоплює використання моделі ViewHolder

0

Існує багато відмінностей між ListView і RecyclerView, але ви повинні пам’ятати про наступне:

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