Android Recyclerview против ListView с Viewholder

150

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

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

редактировать

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

Recyclerview против Listview

Стоит ли использовать RecyclerView вместо ListView?

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

Муштак Джамиль
источник
4
Потому что RecyclerViewон намного быстрее и универсальнее с гораздо лучшим API. Такие вещи, как анимация добавления или удаления элементов, уже реализованы в, и RecyclerViewвам не нужно ничего делать. В этом нет никаких сомнений, выбросьте свое ListViewв мусорное ведро, RecyclerViewоно здесь, чтобы украсть шоу.
Ксавер Капеллер
4
Вы можете связать диспетчер компоновки с RecyclerView, чтобы они не ограничивались списками с вертикальной прокруткой. Это довольно мощный дополнительный функционал.
Алан
@Alan - Что вы имеете в виду, говоря «не ограничиваясь списками с вертикальной прокруткой»? Вы хотите сказать, что Recycle View также может выступать в качестве «заполнителя» для Gridviews и ListViews?
Муштак Джамиль
@XaverKapeller - Было бы здорово, если бы вы могли перечислить различия между ними и ответить на вопрос, а не на комментарий, чтобы это могло помочь мне и другим в будущем, которые могут интересоваться одним и тем же?
Муштак Джамиль
@Alan - Не могли бы вы подробнее рассказать о том, что вы имели в виду, и ответить на вопрос, а не на комментарий. Спасибо за то, что
нашли

Ответы:

10

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

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

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

Etun
источник
5
И вы никогда не сможете создать верхний и нижний колонтитулы в этом смысле. Это просто другие типы представлений в вашем адаптере. Представление списка обертывает ваш адаптер HeaderViewListAdapterи добавляет поддержку заголовков в фоновом режиме. С RecyclerViewтобой все под контролем.
Eugen Pechanec
RecyclerView по умолчанию использует DefaultItemAnimator. Тогда почему вы использовали этот код?
Athira Reddy
9

Хорошо, немного покопался, и я нашел эти жемчужины из статьи Билла Филипса оRecycleView

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

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

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

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

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

Муштак Джамиль
источник
4

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

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

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

Джейсон Брукс
источник
2

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

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

CoolMind
источник
Я использовал ListView без ViewHolder, и он работает. ужасная идея ... как мне заменить TextWatcher во время прокрутки? нет необходимости заменять его ... просто TextWacher должен поместить данные в другой контейнер после повторного использования ... и это может быть сделано очень просто
Селвин
@Selvin, спасибо за ваше мнение. Теперь я не могу редактировать этот проект. На TextWatcherэкране было несколько секунд. Возможно, вы правы, но я не могу это проверить.
CoolMind
1

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

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

Кешав Гера
источник
1

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

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

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

mRecyclerView = (RecyclerView) findViewById (R.id.my_recycler_view); mRecyclerView.setLayoutManager (новый LinearLayoutManager (это)); mRecyclerView.setLayoutManager (новый GridLayoutManager (это, 2));

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

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

Фарзин Боруджерди
источник
0

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

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

Махбубур Рахман Хан
источник