Android Recyclerview vs ListView с Viewholder

Недавно я встретил андроид RecycleView, выпущенный с Android 5.0, и кажется, что RecycleView - это просто инкапсулированный традиционный ListView с включенным в него шаблоном ViewHolder, что способствует повторному использованию представления, а чем создание его каждый раз.

Каковы другие преимущества использования RecycleView? Если оба имеют одинаковый эффект с точки зрения производительности, почему вы решили использовать RecycleView`?

Edit

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

Recyclerview vs Listview

Следует ли использовать RecyclerView для замены ListView?

Почему у RecyclerView нет onItemClickListener()? и как RecyclerView отличается от Listview?

Ответ 1

С появлением Android Lollipop RecyclerView официально появился. RecyclerView гораздо более мощный, гибкий и значительное улучшение над ListView. Я попытаюсь дать вам подробное представление об этом.

1) Шаблон ViewHolder

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

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

2) LayoutManager

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

Теперь, используя RecyclerView, мы можем иметь

i) LinearLayoutManager - который поддерживает как вертикальные, так и горизонтальные списки,

ii) StaggeredLayoutManager - который поддерживает Pinterest как шахматные списки,

iii) GridLayoutManager - который поддерживает отображение сеток, как показано в приложениях галереи.

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

3) Аниматор предметов

ListViews не хватает поддержки хорошей анимации, но RecyclerView привносит в нее совершенно новое измерение. Используя класс RecyclerView.ItemAnimator, анимация представлений становится настолько простой и интуитивно понятной.

4) Украшение предметов

В случае ListViews динамически украшающие элементы, такие как добавление границ или разделителей, никогда не были легкими. Но в случае RecyclerView класс RecyclerView.ItemDecorator дает огромный контроль разработчикам, но делает вещи немного более трудоемкими и сложными.

5) OnItemTouchListener

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

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

Ответ 2

Другим плюсом использования RecycleView является анимация, это можно сделать в двух строках кода

RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator();
        recyclerView.setItemAnimator(itemAnimator);

Но виджет все еще сырой, например, вы не можете создать заголовок и нижний колонтитул.

Ответ 3

Хорошо, так немного копать, и я нашел эти драгоценные камни от Bill Philips статьи на RecycleView

RecyclerView может делать больше, чем ListView, но класс RecyclerView сам имеет меньше обязанностей, чем ListView. Из коробки, RecyclerView не делает:

  • Позиции позиций на экране
  • Анимация просмотров
  • Обрабатывать любые события касания, кроме прокрутки

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

Созданные вами ViewHolders также более эффективны. Подкласс RecyclerView.ViewHolder, который имеет кучу методов RecyclerViewиспользует. ViewHolders знать, с какой позицией они в настоящее время связаны, как а также какие идентификаторы предметов (если у вас есть). В процессе ViewHolderбыл рыцарь. Раньше это было заданием ListViews для просмотр всего элемента и ViewHolder, который удерживается только на небольших частях.

Теперь, ViewHolder держится за все это в ViewHolder.itemViewполе, которое назначено для конструктора ViewHolders для вас.

Ответ 4

Больше от статьи Билла Филлипа (прочитайте это!), но я подумал, что важно указать следующее.

В ListView была некоторая неопределенность в отношении того, как обрабатывать события щелчка: должны ли отдельные представления обрабатывать эти события или же ListView обрабатывает их через OnItemClickListener? Однако в RecyclerView ViewHolder находится в явном виде, чтобы выступать в качестве объекта контроллера уровня строки, который обрабатывает эти детали.

Ранее мы видели, что LayoutManager обрабатывал представления позиционирования, а ItemAnimator обрабатывал их анимацию. ViewHolder - последний элемент: он отвечает за обработку любых событий, которые происходят на определенном элементе, который отображает RecyclerView.

Ответ 5

Я использовал ListView с загрузчиком изображений Glide с ростом памяти. Затем я заменил ListView на RecyclerView. Это не только сложнее в кодировании, но также приводит к большему использованию памяти, чем ListView. По крайней мере, в моем проекте.

В другом действии я использовал сложный список с EditText's. В некоторых из них метод ввода может изменяться, также может применяться a TextWatcher. Если я использовал ViewHolder, как я мог бы заменить TextWatcher во время прокрутки? Итак, я использовал ListView без ViewHolder, и он работает.

Ответ 6

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

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

Пример:

mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));
  • Анимирует общий список действий.

  • Анимации развязаны и переданы ItemAnimator.

Существует больше о RecyclerView, но я думаю, что эти пункты являются основными.

LayoutManager

i) LinearLayoutManager - который поддерживает как вертикальные, так и горизонтальные списки,

II) StaggeredLayoutManager - который поддерживает Pinterest, как разнесенные списки,

iii) GridLayoutManager - который поддерживает отображение сеток, как видно в приложениях галереи.

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

Ответ 7

1. Просмотр держателей

В ListView определение держателей представлений было предложено для сохранения ссылок на представления. Но это не было принуждением. Хотя в этом случае ListView не использовал устаревшие данные. Еще один существенный недостаток неиспользования держателей видов может привести к интенсивной операции поиска видов по идентификаторам каждый раз. Что привело к запаздывающим ListViews.

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

2. Менеджер по расположению

Говоря о ListViews, доступен только один тип ListView, то есть вертикальный ListView. Вы не можете реализовать ListView с горизонтальной прокруткой. Я знаю, что есть способы реализовать горизонтальную прокрутку, но поверьте мне, она не была разработана для такой работы.

Но теперь, когда мы смотрим на Android RecyclerView против ListView, у нас также есть поддержка горизонтальных коллекций. Фактически он поддерживает несколько типов списков. Для поддержки нескольких типов списков используется класс RecyclerView.LayoutManager. Это что-то новое, чего нет в ListView. RecyclerView поддерживает три типа предопределенных менеджеров макетов:

LinearLayoutManager - это наиболее часто используемый менеджер макетов в случае RecyclerView. Благодаря этому мы можем создавать как горизонтальные, так и вертикальные списки прокрутки. StaggeredGridLayoutManager - С помощью этого менеджера компоновки мы можем создавать разнесенные списки. Так же, как экран Pinterest. GridLayoutManager– этот менеджер компоновки можно использовать для отображения сеток, как и любую галерею изображений.

3. Предмет Аниматор

Анимации в списке - это совершенно новое измерение, которое имеет бесконечные возможности. В ListView как таковом нет специальных положений, с помощью которых можно анимировать, добавлять или удалять элементы. Позже, по мере развития android, Googles Chet Haase предложила ViewPropertyAnimator в этом видео-уроке для анимации в ListView.

С другой стороны, сравнивая Android RecyclerView с ListView, он имеет класс RecyclerView.ItemAnimator для обработки анимации. С помощью этого класса можно определить пользовательские анимации для добавления, удаления и перемещения элементов. Также он предоставляет DefaultItemAnimator, если вам не нужны какие-либо настройки.

4. Адаптер

Адаптеры ListView были просты в реализации. У них был основной метод getView, в котором использовалась вся магия. Где взгляды были привязаны к позиции. Также у них был интересный метод registerDataSetObserver, где можно установить наблюдателя прямо в адаптере. Эта функция также присутствует в RecyclerView, но для нее используется класс RecyclerView.AdapterDataObserver. Но преимущество ListView в том, что он поддерживает три реализации адаптеров по умолчанию:

ArrayAdapter CursorAdapter SimpleCursorAdapter Принимая во внимание, что адаптер RecyclerView обладает всеми функциональными возможностями адаптеров ListView, за исключением встроенной поддержки курсоров БД и списков ArrayLists. В RecyclerView.Adapter на данный момент мы должны сделать пользовательскую реализацию для подачи данных в адаптер. Так же, как BaseAdapter делает для ListViews. Хотя, если вы хотите узнать больше о реализации адаптера RecyclerView, обратитесь к примеру Android RecyclerView.

5. Уведомление об изменении данных

При работе с ListView, если набор данных изменяется, необходимо обновить метод notifyDataSetChanged базового адаптера для обновления данных. Или установите для метода setNotifyOnChange значение true, если требуется автоматически вызывать метод notifyDataSetChanged. Но в обоих случаях результат очень тяжел в списке. В основном это освежает взгляды списка.

Но, наоборот, в адаптере RecyclerView, если один элемент или диапазон элементов изменились, есть способы уведомить об изменении соответствующим образом. Это соответственно notifyItemChanged и notifyItemRangeChanged и многие другие:

notifyItemInsterted notifyItemMoved notifyItemRangeInsterted notifyItemRangeRemoved И, конечно, он имеет оригинальный метод для обновления всего списка, т.е. notifyDataSetChanged, который уведомляет измененный весь набор данных об изменениях.

6. Предмет Украшения

Чтобы отобразить пользовательские разделители в ListView, можно легко добавить эти параметры в XML ListView:

XHTML android: divider = "@android: цвет/прозрачный" android: dividerHeight = "5dp" 1 2 android: divider = "@android: цвет/прозрачный" android: dividerHeight = "5dp" Интересная часть об Android RecyclerView заключается в том, что на данный момент он не показывает разделитель между элементами по умолчанию. Хотя ребята из Google, должно быть, намеренно оставили это для настройки. Но это значительно увеличивает усилия разработчика. Если вы хотите добавить разделитель между элементами, вам может потребоваться выполнить пользовательскую реализацию с помощью класса RecyclerView.ItemDecoration.

Или вы можете применить взлом, используя этот файл из официальных примеров: DividerItemDecoration.java

7. OnItemTouchListener

Раньше списочные представления имели простую реализацию для обнаружения кликов, то есть с помощью интерфейса AdapterView.OnItemClickListener.

Но с другой стороны, интерфейс RecyclerView.OnItemTouchListener используется для обнаружения сенсорных событий в Android RecyclerView. Это немного усложняет реализацию, но дает больший контроль разработчику для перехвата сенсорных событий. Официальная документация гласит, что она может быть полезна для манипуляций с жестами, так как она перехватывает событие касания до его доставки в RecyclerView.

Ответ 8

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)); mRecyclerView.setLayoutManager(new GridLayoutManager (this, 2));

  1. Анимация общих действий со списком: анимации отделяются и делегируются ItemAnimator. Существует больше о RecyclerView, но я думаю, что эти пункты являются основными.

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