2015-02-08 2 views
203

Android Docs говорят:Должны ли мы использовать RecyclerView для замены ListView?

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

На самом деле ListView может сделать все выше, если КПД не имеет значения, и мы нашли много вопросов когда мы используем RecyclerView заменить ListView:

  1. Там нет onItemClickListener() для выбора элемента списка - solution

  2. Без разделителя между пунктами списка - solution

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

  4. Нет addHeaderView - solution

Возможно, больше вопросов ...

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

ВОПРОС:

  • Стоит ли мы заменить ListView с RecyclerView полностью?
  • Если нет, то в этом случае лучше использовать RecyclerView вместо ListView, и наоборот?
+8

Ваша нить - это только первая проблема, и это не мой вопрос. – Xcihnegn

+3

Просто укажите, что вы должны использовать recyclerview, если вы заинтересованы в использовании свернутой панели действий. https://medium.com/android-bites/first-steps-with-the-design-support-library-8dcf06230ddd – francas

+4

awsm качество вопроса ... – kiturk3

ответ

8

Вы можете использовать интерфейс для щелчка слушателя. Я также использую этот метод с ListViews.
Нет делителя: Просто добавьте в вашей строке представления с шириной match_parent и высотой 1DP и дать ему цвет фона.
Просто используйте селектор StateList для фона строки.
addHeaderView можно также избежать в ListViews: просто поместите заголовок за пределы Вид.

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

+16

Это не мои вопросы, у меня была ссылка на каждое решение проблемы – Xcihnegn

+4

См. ** ВОПРОС ** – Xcihnegn

+2

Смотрите здесь: http: //www.grokkingandroid.com/first-glance-androids-recyclerview/ – Josef

112

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

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

Основные изменения, которые необходимо внести для миграции, - в вашем адаптере. Если вы хотите продолжать звонить notifyDataSetChanged, вы потеряете большую часть анимации &. Но если вы можете изменить свой адаптер для отправки подробных уведомлений о событиях (добавленных/удаленных/перемещенных/обновленных), то вы получите намного лучшую анимацию и производительность. Эти события позволяют RecyclerView выбирать правильные анимации, а также помогает избежать ненужных вызовов onBind. Вы получите огромное преимущество, если ваши взгляды на предметы сложны. Кроме того, в будущем RecyclerView будет больше компонентов.

+2

Если бы я мог дать вам 100 upvotes я бы. Метод 'notifyDataSetChanged()' заставлял мой «RecyclerView» постоянно запрашивать новые «ViewHolders», устраняя преимущества шаблона «ViewHolder». В поисках решения я нашел ваш комментарий, который в значительной степени отвечает моей проблеме: D спасибо! –

+0

Я не согласен «Вы получите огромную выгоду, если ваши взгляды элементов сложны», у меня есть recyclerView, в котором у адаптера есть 3, если есть, Recyclerview плохо работает в моем случае. Мне пришлось отключить повторное использование с использованием 'isRecyclable (false);' и конечный результат - очень медленный RecyclerView. Я даже не могу изменить это, потребуется много времени, чтобы вернуться к списку :( –

+4

люди используют RV w/many more types, тогда без каких-либо проблем и хорошей производительности. В коде есть что-то еще не так Вы должны использовать systrace/traceview и посмотреть, что происходит. – yigit

3

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

Для любых других целей RecyclerView затмевает ListView. Поскольку RecyclerView заботится только об утилизации, будет проще делать визуальные связанные вещи, которые были тесно связаны в ListView, например, изменение позиции/перегруппировки, анимация (на самом деле она поставляется с RecyclerView.ItemAnimator), настраиваемые макеты (запас имеет StaggeredGrid в дополнение к старый список или стиль сетки, но есть и этот library, который расширяет его еще больше).

Также, если вы хотите использовать CardView, я считаю, что это единственный способ пойти (некоторые good reading, когда использовать карту или список).

+0

Вы имеете в виду захват списка данных с серверов, затем хранящийся в sqlite на телефоне, который будет использоваться в отображении списка (скажем, ваших последователей), лучше использовать просмотр recycler, чем список с держателем вида? – Lion789

+0

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

21

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

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

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

Я написал подробный ответ на эту тему here.

+1

Уверен, RecyclerView увеличивает сложность, но по крайней мере он правильно использует шаблон ViewHolder. –

+0

@IgorGanapolsky +1 для реализации шаблона ViewHolder. –

1

Отличная альтернатива - использование базового адаптера. Он поддерживает использование шаблона Viewholder, а my содержит более 100 строк с растровыми изображениями и кнопками, и он работает очень плавно.

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