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

Android Docs говорят:

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

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

  • Нет выбора onItemClickListener() для выбора элемента списка - решение

  • Нет разделителей между элементами списка - решение

  • Нет встроенного переключателя перекрытия, при нажатии кнопки списка нет визуальной обратной связи - решение

  • Нет addHeaderView для заголовка списка - решение

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

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


Вопрос:

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

Спасибо за внимание и любую идею!

Ответ 1

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

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

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

Ответ 2

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

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

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

Я написал подробный ответ на этот вопрос здесь.

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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