it-roy-ru.com

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

Документы Android говорят:

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

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

  1. Для выбора элемента списка не существует onItemClickListener () - решение

  2. Нет делителя между элементами списка - решение

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

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

Может быть, больше вопросов ...

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

ВОПРОС:

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

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

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

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

117
yigit

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

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

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

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

23
Aritra Roy

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

Так что, если эффективность - ваша забота, тогда да, будет хорошей идеей заменить ListView на RecyclerView.

8
Fantômas

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

Я основал это решение на "человеческих факторах", что создание простого ListView с меньшим количеством кода лучше, если производительность не имеет значения. Я часто вспоминаю профессора в колледже, который любил повторять: "Мой учитель, великий Никлаус Вирт, изобретатель Паскаля, говорил, что если в программе более 50 строк кода, то это точно неверно ..."

Но что убедило меня прекратить использование ListView, так это то, что он недавно был перемещен в категорию "Legacy" в инструменте дизайна Android Studio вместе с RelativeLayout.

https://developer.Android.com/reference/Android/widget/ListView

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

Кроме того, введение в ListView прямо вверху предупреждает, что RecyclerView - лучший вариант: "Для более современного, гибкого и производительного подхода к отображению списков используйте RecyclerView".
https://developer.Android.com/reference/Android/widget/ListView

Кроме того, в руководстве по ListView все еще говорится о загрузчиках курсора, но затем сам API getSupportCursorLoader () был объявлен устаревшим в API 28.
https://developer.Android.com/guide/topics/ui/layout/listview

Последние улучшения в Android Studio:

Файл -> Создать -> Фрагмент -> Фрагмент (список)

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

Таким образом, я не собираюсь использовать ListView вообще для новой разработки, потому что маркировка его "наследие" находится в одном шаге от его устаревания.

5
Elletlar

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

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

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

3
inmyth

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

1
grantespo