Intereting Posts
Android-новичок: onDestroy Фрагмент NavigationDrawer с ListView и настраиваемый заголовок Android Studio не может решить org.junit Фрагмент андроида: фрагмент Невозможно создать экземпляр фрагмента Перевод после ротации Invalidate () фактически не перерисовывает детей RecyclerView аварийно завершает работу, когда «пересмотренные или присоединенные виды не могут быть переработаны» Ошибка тестирования тестовой программы для Android Studio: пустой тестовый комплект Цвет фона в тексте не изменяется при нажатии в popupwindow Изменение цвета фона текущего элемента списка в адаптере getView Как сохранить файл на Android? (FireMonkey) Возможно ли создать навигационное приложение поворотного хода на Android с помощью Google Maps? Загрузка файла на Android Любой способ обнаружить нажатия клавиш тома или изменения громкости с помощью службы android? Поиск местоположения пикселов элемента Listview, кажется, возвращает неправильное значение

Android Recyclerview vs ListView с Viewholder

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

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

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

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

Recyclerview vs Listview

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

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

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

1) Шаблон ViewHolder

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

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

2) LayoutManager

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

Теперь, используя RecyclerView, мы можем иметь

I) LinearLayoutManager – который поддерживает как вертикальные, так и горизонтальные списки,

Ii) StaggeredLayoutManager – который поддерживает Pinterest как шахматные списки,

Iii) GridLayoutManager – который поддерживает отображение гридов в приложениях Gallery.

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

3) Аниматор предметов

ListViews не хватает поддержки хорошей анимации, но RecyclerView привносит в нее совершенно новое измерение. Используя класс RecyclerView.ItemAnimator , анимация представлений становится настолько простой и интуитивно понятной.

4) Украшение предметов

В случае ListViews динамически украшающие элементы, такие как добавление границ или разделителей, никогда не были легкими. Но в случае RecyclerView класс RecyclerView.ItemDecorator дает огромный контроль разработчикам, но делает вещи немного более трудоемкими и сложными.

5) OnItemTouchListener

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

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

Ладно, так немного копать, и я нашел эти драгоценные камни из статьи Билла Филипса в RecycleView

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

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

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

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

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

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

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

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

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

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

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

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

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