RecyclerView против ListView

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

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

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

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

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

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

Solutions Collecting From Web of "RecyclerView против ListView"

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

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

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

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

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

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

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

  • Анимация, добавленная / удаленная, не рассматривалась как вариант использования. Это было полностью для вас, чтобы выяснить, как это делается (сравните RecyclerView. Классы адаптеров уведомляют * предложения методов v. ListViews, чтобы получить представление).

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

RecyclerView – это новая группа ViewGroup, которая готова визуализировать любой вид на основе адаптера аналогичным образом. Он является преемником ListView and GridView , и его можно найти в latest support-v7 version . RecyclerView был разработан с учетом расширяемости , поэтому можно создать любой макет, о котором вы можете думать, но не без небольшой дозы боли в теле.

Ответ от Antonio leiva

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

RecyclerView действительно является мощным представлением, чем ListView . Для получения дополнительной информации вы можете посетить эту страницу .

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

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

Подводя итог моему пониманию, пройдя целую нить.

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

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

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

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

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

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

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

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

В дополнение к вышеперечисленным разницам ниже:

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

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

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

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

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

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

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

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

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

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

Класс ListView или GridView отвечает за прокрутку коллекции элементов. Адаптер отвечает за создание каждого из представлений в списке. Эти старые реализации заменяются RecyclerView из-за сложности, необходимой для изменения поведения ListView или GridView .
Например: Создание горизонтальной прокрутки ListView не входит в API ListView и требует большой работы. Создание пользовательского макета и прокрутки с помощью RecyclerView по-прежнему много, но RecyclerView был создан для расширения, так что это не так уж плохо. А также Анимация добавления или удаления элементов в ListView или GridView является сложной и подверженной ошибкам задачей. RecyclerView делает это намного проще, включает в себя несколько встроенных анимаций и позволяет легко настраивать эти анимации.