2015-02-15 4 views
96

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

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

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

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

Recyclerview vs Listview

Should we use RecyclerView to replace ListView?

Why doesn't RecyclerView have onItemClickListener()? and How RecyclerView is different from Listview?

+4

Поскольку «RecyclerView» намного быстрее и универсален с гораздо лучшим API. Такие вещи, как анимирование добавления или удаления элементов, уже реализованы в «RecyclerView» без необходимости делать что-либо. В этом нет никаких сомнений, бросьте свой «ListView» в корзину, «RecyclerView» здесь, чтобы украсть шоу. –

+4

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

+0

@Alan - Что вы подразумеваете под «не ограничиваясь списками вертикальной прокрутки»? Вы говорите, что Recycle View может выступать в качестве «заполнителя» для Gridviews и ListViews? –

ответ

209

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

1) ViewHolder Pattern

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

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

2) LayoutManager

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

Теперь с помощью RecyclerView, мы можем иметь

я) 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, и дает своим разработчикам большой контроль и власть.

+17

Хороший ответ. Пара дополнительных огромных плюсов: RecyclerView готовит представление только вперед и за видимыми записями, что отлично, если вы извлекаете растровые изображения в фоновом режиме. Производительность значительно быстрее, особенно если вы используете RecyclerView.setHasFixedSize. Старый ListView основан на предпосылке, что нет возможности предварительно просчитать или кэшировать размер записей в списке, что приводит к безумным осложнениям при прокрутке и выполнении макета. Занимает некоторое время, чтобы привыкнуть к нему, но как только вы это сделаете, вы никогда не вернетесь. –

+0

@RobinDavies Отличная точка. Спасибо, что сообщили. Но это не имеет смысла, если размеры предметов разные. –

+0

@AritraRoy Recyclerview поддерживает только lollipop или api 14+ (android 4+)? ... как я читаю «после леденца: в большинстве мест –

7

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

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

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

+3

И вы никогда не сможете создавать верхний и нижний колонтитулы в этом смысле. Это просто другие типы виджетов в вашем адаптере. Просмотр списка обертывает ваш адаптер в ['HeaderViewListAdapter'] (http://developer.android.com/reference/android/widget/HeaderViewListAdapter.html) и добавляет поддержку заголовков в фоновом режиме. С 'RecyclerView' вы управляете. –

8

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

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

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

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

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

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

4

Подробнее от Bill Phillip's article (go read it!), Но я подумал, что важно указать следующее.

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

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

3

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

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

+0

* Я использовал ListView без ViewHolder, и он работает. * Ужасная идея ... * как я могу заменить TextWatcher во время прокрутки?* нет необходимости заменять его ... просто TextWacher должен поместить данные в другой контейнер после повторного использования ... и это можно сделать очень просто – Selvin

+0

@Selvin, спасибо за ваше мнение. Теперь я не могу отредактировать этот проект. На экране было несколько «TextWatcher». Возможно, вы правы, но я не могу это проверить. – CoolMind

Смежные вопросы