Android studio recyclerview или listview

ziginsider

Введение

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

Первый из них прекрасный виджет, который был доступен с API 1. До Android Lollipop мы главным образом использовали этот способ, что было довольно неплохо — API был интуитивно понятен. Но к сожалению мы могли создать только вертикально прокручиваемый список, и чтобы он прокручивался плавно, прриходилось делать все надлежлащим способом. Кроме того, класс ListView довольно тяжелый — у него множество обязанностей. Всякий раз, когда нам требовалось обработать список, т.е. сконфигурировать его, единственный путь сделать это был через объект ListView внутри адаптера.

Сегодня мы используем RecyclerView. Как я упоминал, он появился в Android Lollipop и сразу изменил правила игры. Большинство вещей, которые мы ненавидели в ListView были убраны или изменены в RecyclerView. По умолчанию, мы получали больше возможностей. Создание макетов (LayoutManager) отделено, и мы получили больше свободы для манипуляции с данными, чем манипулирование только внутри адаптера.

Если вы хотите узнать больше об этих механизмах, вы можете глянуть мои статьи, которые рассказывают, как реализовать ListView и RecyclerView

(От переводчика) O RecyclerView можно узнать больше в этой моей заметке https://ziginsider.github.io/RecyclerView/

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

ViewHolder

Паттерн ViewHolder помогает сделать прокрутку нашего списка плавной. Он сохраняет ссылки на элементы списка, чтобы затем адаптер мог их переиспользовать. Благодаря этому надувание View элемента (inflating) и вызов дорогого метода findViewById() происходит всего пару раз, а не для каждого элемента списка.

Адаптер RecyclerView в обязательном порядке заставляет нас реализовать надувание элемента списка с помощью двух методов — onCreateViewHolder() и onBindViewHolder().

ListView, с другой стороны, не делает обязательным реализацию ViewHolder. И, если мы не реализуем надувание сами, внутри getView(), мы останемся без эффективной прокрутки в списке.

LayoutManager

LayoutManager берет на себя ответсвенность за макетирование представления элементов. Благодаря этому у RecyclerView нет ответственности за поозиционирование элементов в списке. LayoutManager дает возможность выбирать позиционирование элементов списка относительно друг друга и выбирать способ прокрутки. Например, если нам нужен вертикальный или горизонтальный список, мы выбираем LinearLayoutManager. Для табличного представления более подходит GridLayoutManager.

Раньше, с помощью ListView, мы могли создать список только с вертикальной прокруткой. Это было не удобно. Чтобы реализовать табличное представление, мы должны были использовать другой виджет — GridView.

ItemDecoration

Обязанности ItemDecoration просты в теории — декорировать элементы списка (рисование за ними, перед ними, между ними)- но нетривиальны в реализации. Вы должны наследоваться от класса ItemDecoration и реализовать ваше решение. У RecyclerView по-умолчанию нет разделителей между строк — это соответствует гайдлайнам Material Design. Однако, если нам необходим разделитель, мы можем использовать DividerItemDecoration и добавить его в RecyclerView.

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

ItemAnimator

Последнее, но не менее важное отличие RecyclerView это наличие ItemAnimator. Как мы можем догадаться, он обрабатывает анимации появления или исчезновения элементов списка, или их изменения. По-умолчанию анимации RecyclerView красивые и плавные. Конечно, мы можем изменить эти анимации, реализовав свой ItemAnimator, но это также не очень просто. Чтобы упростить себе жизнь, мы можем расширить класс SimpleItemAnimator и реализовать методы, которые нам нужны (просто добавить анимации во ViewHolder наших View)

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

Notifying adapter

У нас есть несколько классных механизмов уведомления (notify) в адаптере RecyclerView. Мы все еще можем использовать notifyDataSetChanged(), но, если нам необходимо изменить только один элемент списка, к нашим услугам notifyItemInserted(), notifyItemRemoved() или даже notifyItemChanged() и т.д. Мы должны использовать подходящее уведомление, чтобы сработала надлежащая анимация. Используя ListView мы можем использовать лишь notifyDataSetChanged(), а со всем остальным мы должны были справляться сами.

Вывод

ListView служил нам долгое время. Мы могли покрыть большинство случаев с его помощью. Но потребности пользователей сегодня более сложные. Дизайн списков становится все более и более сложным и ListView уже не справляется. Material Design принес другие изменения — красивее, но сложнее в реализации.

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

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

NB от переводчика: Так и хочется добавить в конце статьи “Аминь!”. Автор мастер рассказывать очевидные вещи. Но, мне кажется, он не совсем ясно дал понять, что RecyclerView намеренно сделан более сырым (т.е. “не из коробки”), чтобы быть более гибким в реализации. И он определенно более сложен. Но это не должно пугать начинающих, т.к. c практикой реализация его не вызывает сложностей. Но, однако, есть очень много хитростей, которые я пока только начал описывать в заметке https://ziginsider.github.io/RecyclerView/

А в тривиальных случаях вполне уместно использовать ListView.

Источник

Читайте также:  Облако mail для андроида

RecyclerView & ListView basic comparison

Feb 5, 2017 · 5 min read

Do you remember the good old ListView? Back then it was the only option for showing items in scrolling lists. Then, at some point, a new player entered the field — the RecyclerView. For some period of time I was definitely confused about which one should I use. But day by day the RecyclerView took the whole stage and there was almost nothing left for the old ListView. Nowadays, if you need a listing functionality, the RecyclerView is the place to go. But what was the reason behind the success of the RecyclerView? Let’s try to find out!

RecyclerView info

Th e RecyclerView was introduced with Android 5.0 (Lollipop). Of course, it is included in the Support Library. Thus, it is compatible event with Android API Level 7.

Similarly to the ListView, the RecyclerView’s main idea is to provide listing functionality. But as you know, this is done in a performance friendly manner. The ‘Recycler’ part of this view’s name is not there by coincidence. The RecyclerView can actually recycle the items with which it’s currently working. Surprise! Surprise! The recycling process is done thanks to a pattern called View Holder. By using it, there is no need to call findViewById() each time we go through the getView() method of our adapter. The references to all views for each list row are kept in-memory. This significantly increases the performance. Of course, you can use this pattern together with a ListView, but it is optional. If you want to use a RecyclerView, you have no other option, but to implement the View Holder pattern. It is mandatory.

Also, the RecyclerView does less things than the ListView. It’s always better to do less, but do it right. That sounds like the RecyclerView has less features than the ListView. But this is not true. It’s actually more flexible and more feature rich. Just all these options are distributed into different entities like the LayoutManager and ItemAnimator. Have you ever heard something about ‘Separation of concerns’? If not, check the Wiki page in the ‘See also’ section.

Another great thing about the RecyclerView is the way it interacts with LayoutManager and ItemAnimator. These two provide some useful functionalities.Thanks to the LayoutManager we can create lists with vertical and horizontal scrolling (LinearLayoutManager) and uniform and staggered grids (GridLayoutManager, StaggeredLayoutManager). Or we can create our own manager with extra bit of customization. Thanks to the ItemAnimator we can make use of different animations. There are animations for adding, updating and removing items from the RecyclerView.

And let’s not forget the great integration with the DiffUtil class. Long story short, this class helps us to calculate the difference between two lists of data. It’s a must when using the RecyclerView! You can check the article about the DiffUtil class in the ‘See also’ section.

Of course, there are some drawbacks when using the RecyclerView. The distribution of responsibilities to the LayoutManager and the ItemAnimator, adds extra complexity. And if we include the mandatory usage of the ViewHolder pattern, the learning curve becomes not so smooth. Our brains are not capable of working with many different components at the same time. Thus it can be harder to get used to the way of using the RecyclerView.

Another inconvenient thing is the lack of a listener like the OnItemClickListener. Of course, we can easily overcome that by using simple interfaces, but it’s still worth mentioning.

Pros & Cons of RecyclerView

  • integrated animations for adding, updating and removing items
  • enforces the recycling of views by using the ViewHolder pattern
  • supports both grids and lists
  • supports vertical and horizontal scrolling
  • can be used together with DiffUtil
  • adds complexity
  • no OnItemClickListener

ListView info

The ListView has been around since the very beginning of Android. It was available even in API Level 1 and it has the same purpose like the RecyclerView.

The usage of the ListView is actually really simple. In this aspect, it’s not like its successor. The learning curve is smoother than the one for the RecyclerView. Thus, it is easier to grasp. We don’t have to deal with things like the LayoutManager, ItemAnimator or DiffUtil.

If we want to keep things simple, we can even use default adapters. They can be used to show a simple text as a content for our items. There is no need of extending other classes or implementing interfaces. Of course, there is no problem to make our row elements more complicated, if we want to. Then we will have to construct our own custom adapters.

Читайте также:  Как посмотреть разрешение экрана android

What about the OnItemClickListener? Well, it is one of these small, cool things in the life of the developer. It’s really simple to use and doesn’t increase complexity at all. The thing it does is self-explanatory. And I prefer working with such a listener, rather then creating my own interfaces for handling the same events in the RecyclerView. But that’s life! 🙂

We should also mention the ExpandableListView which is heavily based on the ListView. Actually, it extends the functionality of the ListView. It provides a two-level list, consisting of parent and child items. Each parent item is associated with many child items. That allows the usage of expanding and collapsing functionality for the child items. To use the ExpandableListView, we must construct our own custom adapter.

If we want to optimize the performance of our ListView, we can use the idea of the ViewHolder pattern here as well. The thing is, that the usage of this pattern is not mandatory. Thus, folks who are not familiar with it, can construct their ListView without a ViewHolder. That can decrease the performance.

Pros & Cons of ListView

  • simple usage
  • default adapters
  • available OnItemClickListener
  • it’s the foundation of the ExpandableListView
  • doesn’t embrace the usage of the ViewHolder pattern

Источник

RecyclerView против ListView

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

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

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

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

13 ответов

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

повторно использует ячейки при прокрутке вверх / вниз — это возможно при реализации View Holder в адаптере listView, но это была необязательная вещь, в то время как в RecycleView это способ записи адаптера по умолчанию.

отделяет лист от контейнер — таким образом, вы можете легко поместить элементы списка во время выполнения в разные контейнеры (linearLayout, gridLayout) с настройкой LayoutManager.

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

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

Читайте также:  Универсальная прошивка android для всех

Ниже приведены несколько ключевых моментов / различий между 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 не имеет такого рода объединения механизм.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Оцените статью