RecyclerView против ListView

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

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

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

enter image description here

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

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

13 ответов


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 повторное использование для тех же типов элементов (посмотреть на одного из адаптеров, которые используются в ListView, Если вы изучите метод getView, вы увидите, что ничто не мешает программисту создавать новое представление для каждой строки, даже если оно передается через convertView переменной)

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

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

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

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


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

ответ взят из Антонио Лейва

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

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


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

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

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

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

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

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

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


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

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


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


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

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

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

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

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

  5. очень простой элемент анимации в случае RV.


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


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

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

  2. A RecyclerView сложнее в кодинге.

  3. A RecyclerView не содержит header и footer, так что это минус.

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


  1. вы можете использовать интерфейс для предоставления прослушивателя щелчка. Я использую это техника со списками тоже.
  2. нет разделителя: просто добавьте в свою строку вид с шириной match_parent и высота 1dp и дают ему цвет фона.
  3. просто используйте селектор списка состояний для фона строки.
  4. addHeaderView можно избежать и в ListViews: просто поместите Заголовок вне представления.

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


преимущества RecyclerView над listview:

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

  2. простой анимации.

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

преимущества listView над recyclerView:

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

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

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

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


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

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

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

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

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

FastAdapter от mikepenz

FlexibleAdapter по davideas