RecyclerView против ListView

295

От разработчика Android ( Создание списков и карт ):

Виджет RecyclerView - это более продвинутая и гибкая версия ListView.

Хорошо, это звучит круто, но когда я увидел этот пример изображения, я действительно запутался в разнице между этими двумя.

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

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

Итак, в какой ситуации следует использовать RecyclerView?

Blaze Tama
источник
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что существует более гибкий элемент управления для обработки «списочных данных», который следует шаблонам делегирования проблем и оставляет для себя только одну задачу - утилизацию предметов.

daneejela
источник
16
Основная обязанность представления списка заключается в том, чтобы: 1) визуально расположить элементы в заданной области и, предпочтительно, 2) повторно использовать элементы. С RecylerView это разбивается на отдельные обязанности - перезапускается повторное представление корзины, и LayoutManager упорядочивает элементы на экране. Другими словами, представление recycle не знает / не заботится о том, где разместить элементы на экране, оно просто заботится об их переработке. Из документа Android: «Изменяя LayoutManager, RecyclerView можно использовать для реализации стандартного списка с вертикальной прокруткой, равномерной сетки, смещенных сеток, горизонтально прокручиваемых коллекций и т. Д.»
daneejela
32
«Повторное использование ячеек при прокрутке вверх / вниз»: насколько я знаю, это совершенно неправильно, потому что это происходит даже в просмотре списка без держателя просмотра.
Рубан
16
Основное использование держателя представления в listview - ваш код может часто вызывать findViewById () во время прокрутки ListView, что может снизить производительность. Даже когда адаптер возвращает раздутое представление для повторного использования, вам все равно нужно искать элементы и обновлять их. Способ обойти повторное использование findViewById () - это использовать шаблон дизайна «Держатель вида». Объект ViewHolder хранит каждое из представлений компонента в поле тега макета, поэтому вы можете сразу получить к ним доступ без необходимости повторного поиска.
Рубан
7
То, что я пытаюсь сказать, это то, что строка будет переработана, даже если вы реализуете просмотр списка без держателя представления. Это свойство и преимущество listview. Это то, что они создали listview.
Рубан
они не сделали ничего особенного, эти функции могут быть добавлены кем угодно. Вы можете расширить ListView и baseAdapter и добавить любую функцию к нему, если хотите. на самом деле нет никакой разницы между этими двумя.
MDP
39

Чтобы представления списка имели хорошую производительность, вам необходимо реализовать шаблон держателя, и это легко испортить, особенно если вы хотите заполнить список несколькими видами.

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

CaptRespect
источник
6
Да ! , должно быть больше дискуссий о том, когда НЕ использовать переработчик. Если в ваших строках есть содержимое, динамически добавляемое на основе данных модели, и вы используете представление Recycler, BOOM.
Рана Дип
1
Вы должны иметь возможность добавлять динамический контент на основе данных модели. Вам просто нужно настроить различные представления для любого типа контента, который вы хотите поддерживать.
CaptRespect
36

ListViewявляется предком RecyclerView. Было много вещей, которые ListViewлибо не делали, либо не делали хорошо. Если бы вы собрали недостатки ListViewи решили проблему путем абстрагирования проблем в разные области, вы бы получили нечто вроде представления переработчика. Вот основные проблемы с ListViews:

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

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

  • Поддерживается только вертикальная прокрутка с отображением строк (представление Recycler не заботится о том, где размещены представления и как они перемещаются, оно абстрагировано в a LayoutManager. Поэтому Recycler может поддерживать традиционный, 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. Для более подробной информации вы можете посетить эту страницу .

IntelliJ Amiya
источник
5
Мне нравится это предложение из вашего ответа: это Android, так что все не так просто. Это верно для разработки Android-приложений, но я думаю, что это просто неправильно в том, как они разработали API, а также шаблоны для построения. Android-приложение. Теоретически, хороший дизайн должен скрывать все возможные сложности от программистов (но все же быть доступным для продвинутых), их обычно волнует бизнес-логика, данные и другие алгоритмы, помимо борьбы с проблемами, связанными с пользовательским интерфейсом (и более утомительными проблемами, которые существуют в настоящее время). в разработке Android).
Безнадежно
18

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

Если ListView работает для вас, нет причин для миграции. Если вы пишете новый пользовательский интерфейс, вам может быть лучше с RecyclerView.

RecylerView имеет встроенный ViewHolder, не нужно реализовывать наш собственный, как в listView. Он поддерживает уведомление по определенному индексу, а также

Такие вещи, как анимация добавления или удаления элементов, уже реализованы в RecyclerView без необходимости что-либо делать

Мы можем связать менеджер компоновки с RecyclerView, это можно использовать для получения случайных представлений в recycleview, в то время как это было ограничением в ListView. В ListView единственным доступным типом представления является вертикальный ListView. Не существует официального способа даже реализовать горизонтальный ListView. Теперь, используя RecyclerView, мы можем получить

i) LinearLayoutManager - который поддерживает как вертикальные, так и горизонтальные списки, ii) StaggeredLayoutManager - который поддерживает Pinterest как смещенные списки, iii) GridLayoutManager - который поддерживает отображение сеток, как видно в приложениях Gallery.

И самое лучшее, что мы можем делать все это динамически, как мы хотим.

Паван Махешвари
источник
14

Основное преимущество:

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

Мохаммед Имран Н
источник
4

В дополнение к вышеперечисленным различиям немного больше:

  1. RV разделяет создание представления и привязку данных к представлению. В LV необходимо проверить, является ли convertView нулевым или нет для создания представления, прежде чем связывать с ним данные. Таким образом, в случае RV представление будет создаваться только тогда, когда это необходимо, но в случае LV можно пропустить проверку для convertview и создавать представление каждый раз.

  2. Переключение между сеткой и списком стало проще с LayoutManager.

  3. Нет необходимости уведомлять и обновлять все элементы, даже если изменен только один элемент.

  4. Нужно было реализовать кэширование представлений в случае LV. Это предусмотрено в RV по умолчанию. (Существует разница между кэшированием и переработкой.)

  5. Очень простая анимация предметов в случае RV.

Virat18
источник
4

Преимущества RecyclerView перед просмотром по списку:

  1. Содержит ViewHolder по умолчанию.

  2. Простая анимация.

  3. Поддерживает горизонтальные, сеточные и разнесенные макеты

Преимущества listView по сравнению с recyclerView:

  1. Легко добавить разделитель.

  2. Может использовать встроенный arrayAdapter для простых простых списков

  3. Поддерживает верхний и нижний колонтитулы.

  4. Поддерживает OnItemClickListner.

Манохар Редди
источник
4
Насколько я понимаю, вы можете легко добавить разделитель в recyclerView, используя 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

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

В ListView вы можете легко построить список без использования ViewHolder. Но не в случае с RecyclerView.

2. Адаптер

Оба они являются AdapterViews, да. Работает на основе класса адаптера.

Построить ListView легко, используя адаптеры по умолчанию, такие как ArrayAdapter, CursorAdapter, но RecyclerView предоставляет класс RecyclerView.Adapter, чтобы создать новый пользовательский класс адаптера.

Вы не можете использовать ArrayAdapter или любой другой встроенный адаптер с RecyclerView.

3. Расположение предметов

Я создал Vertical ListView в простом и менее кода. Но что, если нам нужно создать GridView?

RecyclerView использует LayoutManager для упорядочивания своих элементов. Есть 3 класса LayoutManager.

  • LinearLayoutManager - помогает создать список линейных типов.
  • GridLayoutManager - используется для создания сетки.
  • StaggeredGridLayoutManager - используется для создания staggeredgrid .

Анимации

В ListView отсутствуют базовые анимации. Но RecyclerView поставляется с простой анимацией.

делитель

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

с 25.1.0 класс DividerItemDecoration можно использовать для создания простого делителя.

Нажмите События

В RecyclerView отсутствует OnItemClickListener , да, это очень печально. Но они дают больше контроля разработчику, предоставляя RecyclerView.OnItemTouchListener.

Методы уведомления

Вам необходимо вызвать соответствующие методы notify * для выполнения правильной анимации. RecylcerView имеет много методов notify * при сравнении с ListView.

Виджей Рам
источник
3

Я думаю, что главное и самое большое отличие, которое у них есть, заключается в том, ListViewчто во время создания или размещения элемента он ищет положение элемента, а с другой стороны RecyclerView- тип элемента. если есть другой элемент, созданный с тем же типом RecyclerView, не создавайте его снова. Сначала запрашивается адаптер, а затем запрашивается вторичный пул, если в повторном пуле говорится «да, я создал тип, похожий на него», а затем RecyclerViewне пытается создать такой же тип. ListViewне имеет такого механизма объединения.

Мустафа Гювен
источник
2

По моему мнению, это RecyclerViewбыло сделано для решения проблемы с шаблоном повторного использования, используемым в списках, потому что это усложняло жизнь разработчика. Со всем остальным вы можете справиться более или менее. Например я использую тот же адаптер для ListViewи GridViewэто не имеет значения в обоих представлениях о getView, getItemCount, getTypeCountиспользуется так это то же самое. RecyclerViewне требуется, если ListViewс ListAdapterили GridViewс сеточными адаптерами уже работает для вас. Если вы правильно внедрили ViewHolderшаблон в свои списки, вы не увидите никаких больших улучшений по сравнению с ним RecycleView.

aimiliano
источник
2

Я немного работал с RecyclerViewи до сих пор предпочитаю ListView.

  1. Конечно, оба они используют ViewHolders, так что это не преимущество.

  2. А RecyclerViewсложнее в кодировании.

  3. A RecyclerViewне содержит верхнего и нижнего колонтитула, поэтому это минус.

  4. A ListViewне требует создания ViewHolder. В случаях, когда вы хотите иметь список с разделами или подзаголовками, было бы неплохо создавать независимые элементы (без ViewHolder), это проще и не требует отдельных классов.

CoolMind
источник
1
Вы можете сделать заголовок и сторону содержимого в адаптере переработчика просмотра, и это будет более гибким, чем просмотр списка. просто трудно изменить свой взгляд на список переработчиков, но если вы сможете это сделать, вы поймете, что я имею в виду. список устаревших просто попробуйте попробовать изучить
список
2
@erginduran, я использовал оба. ListView по-прежнему широко используется и не считается устаревшим. Также он тратит меньше памяти, чем RecyclerView. Если вы хотите только заменить ListView на RecyclerView, это не будет хорошей идеей.
CoolMind
просто проверьте, почему эти ребята разработали переработчик для? это улучшение listview, верно? в google play есть много старых библиотек и приложений, так что вы правы: список все еще широко используется. Просто оставьте старые вещи в прошлом. проверить сравнения -> ссылка
erginduran
@erginduran, спасибо. Вы правы, RecyclerView имеет некоторые преимущества. Мой ответ был о обычных задачах, в которых ListView иногда проще, чем RecyclerView. Конечно, анимация и некоторые другие улучшения сложны или невозможны в ListView.
CoolMind
Я добавил некоторые аспекты в эту тему, см. Stackoverflow.com/a/39721769/2914140 .
CoolMind
1
  1. Вы можете использовать интерфейс для предоставления прослушивателя кликов. Я использую эту технику с ListViews тоже.
  2. Без делителя: просто добавьте в вашу строку View с шириной match_parent и высотой 1dp и присвойте ему цвет фона.
  3. Просто используйте селектор StateList для фона строки.
  4. addHeaderView можно также избежать в ListViews: просто поместите заголовок за пределы представления.

Так что, если эффективность - ваша забота, тогда да, это хорошая идея заменить ListView на RecyclerView.

Джей Патель
источник
0

Простой ответ: вы должны использовать RecyclerView в ситуации, когда вы хотите показать много элементов, а их число является динамическим. ListView следует использовать только тогда, когда количество элементов всегда одинаково и ограничено размером экрана.

Вам труднее, потому что вы думаете только с учетом библиотеки Android.

Сегодня существует множество опций, которые помогают вам создавать собственные адаптеры, упрощая создание списков и сеток динамических элементов, которые вы можете выбирать, изменять порядок, использовать анимацию, разделители, добавлять нижние колонтитулы, верхние колонтитулы и т. Д. И т. Д. И т. Д.

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

Я рекомендую вам проверить эти две библиотеки для создания простых адаптеров:

FastAdapter от mikepenz

FlexibleAdapter от davideas

Эрик Мойя
источник
1
Я думаю, что ваши заявления о разнице в производительности между ними преувеличены. Я использую ListView в производственном приложении с 2012 года, отображая до 3000 элементов с ~ 10 различными представлениями в каждой строке, абсолютно без проблем с производительностью даже на старых устройствах Android 2.3.
Магнус W
0

RecyclerПросмотреть информацию

RecyclerViewБыл введен с Android 5.0 (Lollipop). он включен в библиотеку поддержки . Таким образом, он совместим с Android API Level 7.

Точно так же к ListView, RecyclerView’sосновная идея заключается в том, чтобы обеспечить листинг функциональности в производительности дружественной манере. Часть «Recycler» в названии этой точки зрения не случайно. RecyclerViewМожет фактически переработать пункты , с которыми он в настоящее время работает. Процесс переработки осуществляется благодаря шаблону под названием View Holder .

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

Плюсы:

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

Минусы:

  • добавляет сложности
  • нет OnItemClickListener

Информация о ListView

Это ListViewбыло вокруг с самого начала Android. Он был доступен даже в API Level 1и имеет ту же цель, что и RecyclerView.

Использование ListView на самом деле очень просто. В этом аспекте это не похоже на его преемника. Кривая обучения более плавная, чем у RecyclerView. Таким образом, это легче понять. Нам не нужно иметь дело с такими вещами, как LayoutManager, ItemAnimator или DiffUtil.

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

Плюсы:

  • простое использование
  • адаптеры по умолчанию
  • доступно OnItemClickListener
  • это основа ExpandableListView

Минусы:

  • не охватывает использование шаблона ViewHolder
Basi
источник
0

Есть много различий между ListView и RecyclerView, но вы должны знать следующее, в частности:

  • Шаблон ViewHolder не является обязательным в ListView, но он встроен в RecyclerView.
  • ListView поддерживает только вертикальную прокрутку, но RecyclerView не ограничивается вертикальной прокруткой списков.
Sachin Pareek
источник