Android Recyclerview против ListView с Viewholder

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

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

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

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

Recyclerview vs Listview

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

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

5 ответов


с появлением 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 - который поддерживает отображение сетки, как показано в галерее приложений.

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

3) Пункт Аниматор

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

4) Элемент Украшения

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

5) OnItemTouchListener

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

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


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

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

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

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

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

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


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

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

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


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

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

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


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

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