RecyclerView
RecyclerView — это группа представлений для отображения коллекций; Он предназначен для более гибкой замены старых групп представлений, таких как ListView и GridView. В этом руководстве объясняется, как использовать и настраивать RecyclerView в приложениях Xamarin.Android.
RecyclerView
Многие приложения должны отображать коллекции одного типа (например, сообщения, контакты, изображения или композиции); Часто эта коллекция слишком велика, чтобы поместиться на экране, поэтому она отображается в небольшом окне, которое может плавно прокручивать все элементы коллекции. RecyclerView — это мини-приложение Android, которое отображает коллекцию элементов в списке или сетке, позволяя пользователю прокручивать коллекцию. Ниже приведен снимок экрана с примером приложения, которое используется для RecyclerView отображения содержимого папки «Входящие» электронной почты в вертикальном прокручиваемом списке:

RecyclerView предлагает две привлекательные функции:
- Она имеет гибкую архитектуру, которая позволяет изменять его поведение, подключая предпочтительные компоненты.
- Она эффективна с большими коллекциями, так как повторно использует представления элементов и требует использования владельцев представлений для кэширования ссылок на представления.
В этом руководстве объясняется, как использовать RecyclerView в приложениях Xamarin.Android; как добавить RecyclerView пакет в проект Xamarin.Android, а также описано, как RecyclerView работает в типичном приложении. Приведены реальные примеры кода, показывающие, как интегрироваться RecyclerView в приложение, как реализовать щелчок в представлении элементов и как обновлять RecyclerView его при изменении базовых данных. В этом руководстве предполагается, что вы знакомы с разработкой на Xamarin.Android.
Требования
Хотя RecyclerView она часто связана с Android 5.0 Lollipop, она предлагается в качестве библиотеки поддержки — RecyclerView работает с приложениями, предназначенными для API уровня 7 (Android 2.1) и более поздних версий. Для использования RecyclerView в приложениях на основе Xamarin требуется следующее:
- Xamarin.Android — Xamarin.Android 4.20 или более поздней версии необходимо установить и настроить с помощью Visual Studio или Visual Studio для Mac.
- Проект приложения должен включать пакет Xamarin.Android.Support.v7.RecyclerView . Дополнительные сведения об установке пакетов NuGet см. в разделе Пошаговое руководство. Включение NuGet в проект.
Обзор
RecyclerView можно рассматривать как замену мини-приложений ListView и GridView в Android. Как и его предшественники, RecyclerView он предназначен для отображения большого набора данных в небольшом окне, но RecyclerView предлагает больше вариантов макета и лучше оптимизирован для отображения больших коллекций. Если вы знакомы с ListView , существует несколько важных различий между ListView и RecyclerView :
- RecyclerView немного сложнее в использовании: необходимо написать больше кода для использования RecyclerView по сравнению ListView с .
- RecyclerView не предоставляет предопределенный адаптер; необходимо реализовать код адаптера, который обращается к источнику данных. Однако Android включает несколько предопределенных адаптеров, которые работают с ListView и GridView .
- RecyclerView не предлагает событие щелчка по элементу, когда пользователь касается элемента; Вместо этого события щелчка по элементу обрабатываются вспомогательными классами. Напротив, ListView предлагает событие щелчка элемента.
- RecyclerView повышает производительность за счет повторного использования представлений и применения шаблона владельца представления, что исключает ненужные поиски ресурсов макета. Использование шаблона держателя представления является необязательным в ListView .
- RecyclerView основан на модульной конструкции, которая упрощает настройку. Например, вы можете подключить другую политику макета без значительных изменений в коде приложения. В отличие от этого, ListView является относительно монолитным по структуре.
- RecyclerView включает встроенные анимации для добавления и удаления элементов. ListView Анимация требует дополнительных усилий со стороны разработчика приложения.
Разделы
Части и функции RecyclerView
В этом разделе объясняется, как Adapter , LayoutManager и ViewHolder работают вместе в качестве вспомогательных классов для поддержки RecyclerView . В нем представлен общий обзор каждого из этих вспомогательных классов и объясняется, как их использовать в приложении.
Базовый пример RecyclerView
Этот раздел основан на информации, предоставленной в разделе Части и функции RecyclerView , предоставляя реальные примеры кода, демонстрирующие реализацию различных RecyclerView элементов для создания реального приложения для просмотра фотографий.
Расширение примера RecyclerView
В этом разделе добавляется дополнительный код в пример приложения, представленный в примере Basic RecyclerView, чтобы продемонстрировать, как обрабатывать события щелчка элемента и обновлять RecyclerView их при изменении базового источника данных.
Итоги
В этом руководстве представлено мини-приложение Android RecyclerView . В нем объясняется, как добавить RecyclerView библиотеку поддержки в проекты Xamarin.Android, как RecyclerView перезапускает представления, как применяется шаблон владельца представления для повышения эффективности, а также как различные вспомогательные классы, составляющие RecyclerView совместную работу для отображения коллекций. В нем приведен пример кода для демонстрации RecyclerView интеграции в приложение, объясняется, как адаптировать RecyclerView политику макета путем подключения к различным диспетчерам макета, а также описано, как обрабатывать события щелчка элемента и уведомлять об RecyclerView изменениях источника данных.
Дополнительные сведения о RecyclerView см. в справочнике по классу RecyclerView.
Связанные ссылки
- RecyclerViewer (пример)
- Введение в Lollipop
- RecyclerView
В чем разница между ListView и RecyclerView?
RecyclerView был создан как улучшенная замена ListView . Основные отличия следующие:
1. RecyclerView переиспользует ячейки списка при скроллинге. Для реализации этой логики используется класс ViewHolder .
В ListView тоже можно реализовать адаптер с ViewHolder , но это необязательно и требует написания бойлерплейт кода.
2. RecyclerView разделяет хранение данных и логику отображения. С RecyclerView легко изменить лэйаут в рантайме, используя различные реализации абстрактного класса LayoutManager .
3. Логика отображения анимации элементов вынесена из RecyclerView в класс ItemAnimator .
В целом RecyclerView имеет более гибкий API, чем ListView , благодаря хорошему дизайну и соответствию принципу единственной ответсвенности.
RecyclerView и ListView. В чем разница?
Поскольку мы Android разработчики, нам не сложно реализовать прокручиваемый список тем способом, который соответствует задаче. Но два наиболее популярных пути — ListView и RecyclerView.
Первый из них прекрасный виджет, который был доступен с API 1. До Android Lollipop мы главным образом использовали этот способ, что было довольно неплохо — API был интуитивно понятен. Но к сожалению мы могли создать только вертикально прокручиваемый список, и чтобы он прокручивался плавно, прриходилось делать все надлежлащим способом. Кроме того, класс ListView довольно тяжелый — у него множество обязанностей. Всякий раз, когда нам требовалось обработать список, т.е. сконфигурировать его, единственный путь сделать это был через объект ListView внутри адаптера.
Сегодня мы используем RecyclerView. Как я упоминал, он появился в Android Lollipop и сразу изменил правила игры. Большинство вещей, которые мы ненавидели в ListView были убраны или изменены в RecyclerView. По умолчанию, мы получали больше возможностей. Создание макетов (LayoutManager) отделено, и мы получили больше свободы для манипуляции с данными, чем манипулирование только внутри адаптера.
Если вы хотите узнать больше об этих механизмах, вы можете глянуть мои статьи, которые рассказывают, как реализовать ListView и RecyclerView
(От переводчика) O RecyclerView можно узнать больше в этой моей заметке https://ziginsider.github.io/RecyclerView/
Итак, опишем наиболее существенные различия между этими двумя механизмами..
ViewHolder
Паттерн ViewHolder помогает сделать прокрутку нашего списка плавной. Он сохраняет ссылки на элементы списка, чтобы затем адаптер мог их переиспользовать. Благодаря этому надувание View элемента (inflating) и вызов дорогого метода findViewById() происходит всего пару раз, а не для каждого элемента списка.
Адаптер RecyclerView в обязательном порядке заставляет нас реализовать надувание элемента списка с помощью двух методов — onCreateViewHolder() и onBindViewHolder().
ListView, с другой стороны, не делает обязательным реализацию ViewHolder. И, если мы не реализуем надувание сами, внутри getView(), мы останемся без эффективной прокрутки в списке.
LayoutManager
LayoutManager берет на себя ответсвенность за макетирование представления элементов. Благодаря этому у RecyclerView нет ответственности за поозиционирование элементов в списке. LayoutManager дает возможность выбирать позиционирование элементов списка относительно друг друга и выбирать способ прокрутки. Например, если нам нужен вертикальный или горизонтальный список, мы выбираем LinearLayoutManager. Для табличного представления более подходит GridLayoutManager.
Раньше, с помощью ListView, мы могли создать список только с вертикальной прокруткой. Это было не удобно. Чтобы реализовать табличное представление, мы должны были использовать другой виджет — GridView.
ItemDecoration
Обязанности ItemDecoration просты в теории — декорировать элементы списка (рисование за ними, перед ними, между ними)- но нетривиальны в реализации. Вы должны наследоваться от класса ItemDecoration и реализовать ваше решение. У RecyclerView по-умолчанию нет разделителей между строк — это соответствует гайдлайнам Material Design. Однако, если нам необходим разделитель, мы можем использовать DividerItemDecoration и добавить его в RecyclerView.
В случае ListView мы можем добавить разделитель прямо в описании layout ListView в файле xml. Но у нас нет гибкого механизма, наподобие ItemDecoration, для реализации разделителя.
ItemAnimator
Последнее, но не менее важное отличие RecyclerView это наличие ItemAnimator. Как мы можем догадаться, он обрабатывает анимации появления или исчезновения элементов списка, или их изменения. По-умолчанию анимации RecyclerView красивые и плавные. Конечно, мы можем изменить эти анимации, реализовав свой ItemAnimator, но это также не очень просто. Чтобы упростить себе жизнь, мы можем расширить класс SimpleItemAnimator и реализовать методы, которые нам нужны (просто добавить анимации во ViewHolder наших View)
Честно говоря, реализация анимации в ListView была болью в заднице. Опять же, нам нужно было выяснять как мы справимся с этой задачей. Ничего хорошего. Я рад, что это закончилось.
Notifying adapter
У нас есть несколько классных механизмов уведомления (notify) в адаптере RecyclerView. Мы все еще можем использовать notifyDataSetChanged(), но, если нам необходимо изменить только один элемент списка, к нашим услугам notifyItemInserted(), notifyItemRemoved() или даже notifyItemChanged() и т.д. Мы должны использовать подходящее уведомление, чтобы сработала надлежащая анимация. Используя ListView мы можем использовать лишь notifyDataSetChanged(), а со всем остальным мы должны были справляться сами.
Вывод
ListView служил нам долгое время. Мы могли покрыть большинство случаев с его помощью. Но потребности пользователей сегодня более сложные. Дизайн списков становится все более и более сложным и ListView уже не справляется. Material Design принес другие изменения — красивее, но сложнее в реализации.
К счастью, когда был представлен RecyclerView, многие проблемы ушли. Этот механизм более эффективен по-умолчанию, анимации проще, макетирование проще и API намного приятнее.
Поэтому, если вы когда-либо задумываетесь какой из них выбрать — ваша первая мысль определенно должна быть о RecyclerView.
NB от переводчика: Так и хочется добавить в конце статьи “Аминь!”. Автор мастер рассказывать очевидные вещи. Но, мне кажется, он не совсем ясно дал понять, что RecyclerView намеренно сделан более сырым (т.е. “не из коробки”), чтобы быть более гибким в реализации. И он определенно более сложен. Но это не должно пугать начинающих, т.к. c практикой реализация его не вызывает сложностей. Но, однако, есть очень много хитростей, которые я пока только начал описывать в заметке https://ziginsider.github.io/RecyclerView/
А в тривиальных случаях вполне уместно использовать ListView.
14 11 2017
- Java
- Android Quizzes 2021
- Реактивное программирование с применением RxJava
- Android изнутри. Часть I
- Большие запросы к базе данных на Android
- ProgressDialog умер, да здравствует ProgressBar!
- Введение в Android Architecture Components
- Firebase Tutorial. Part II. — Как автоматически развернуть сайт на хостинге Firebase из GitHub-репозитория?
- Firebase Tutorial — Firebase database. Part I.
- У меня было 10 Android собеседований за последние два года. (перевод)
- Android Tutorial — Facebook SDK Login. Part III. Get Posts.
- Android Tutorial — Facebook SDK Login. Part II. Share content.
- Android Tutorial — Facebook SDK Login. Part I.
- Оптимизация прокрутки вложенных в друг друга RecyclerView
- RecyclerView и ListView. В чем разница?
- Различные типы Item View в RecyclerView
- Тесты сделают вас счастливее (перевод).
- Пример анимации в Android с использованием TimeAnimator.
- Android. Два способа записать результат Timer в пользовательский поток (UI Thread).
- Видео. Architecture Components. Solving the Lifecycle Problem. Перевод субтитров.
- Зачем нужны интерфейсы в ООП?
- Видео. Architecture Components. Improve Your App’s Design. Перевод субтитров.
- Видео. Google I/O ’17 Architecture Components — Introduction. Перевод субтитров.
- Препарирование ContentProvider
- REST. Описание концепции. Особенности реализации API. Максимально кратко.
- Лоадеры (loaders) в Android. Для чего нужны. Конспект.
- Volley vs Retrofit. Описание библиотек REST API.
- Краткий конспект реализации Garbage Collector в Java
- Препарирование RecyclerView
- Лексикон прописных истин Android
- Android Quizzes 2021
- Review Currency App task.
- Foreground Service Android demo App — stopwatch
- Simple Custom View demo App — circular progress bar
- Simple RecyclerView demo App — Stopwatch
- RS School Android 2021
- Реактивное программирование с применением RxJava
- Android изнутри. Часть I
- Большие запросы к базе данных на Android
- ProgressDialog умер, да здравствует ProgressBar!
- Введение в Android Architecture Components
- Firebase Tutorial. Part II. — Как автоматически развернуть сайт на хостинге Firebase из GitHub-репозитория?
- Firebase Tutorial — Firebase database. Part I.
- У меня было 10 Android собеседований за последние два года. (перевод)
- Android Tutorial — Facebook SDK Login. Part III. Get Posts.
- Android Tutorial — Facebook SDK Login. Part II. Share content.
- Android Tutorial — Facebook SDK Login. Part I.
- Оптимизация прокрутки вложенных в друг друга RecyclerView
- RecyclerView и ListView. В чем разница?
- Различные типы Item View в RecyclerView
- Тесты сделают вас счастливее (перевод).
- Пример анимации в Android с использованием TimeAnimator.
- Android. Два способа записать результат Timer в пользовательский поток (UI Thread).
- Видео. Architecture Components. Solving the Lifecycle Problem. Перевод субтитров.
- Зачем нужны интерфейсы в ООП?
- Видео. Architecture Components. Improve Your App’s Design. Перевод субтитров.
- Видео. Google I/O ’17 Architecture Components — Introduction. Перевод субтитров.
- Препарирование ContentProvider
- REST. Описание концепции. Особенности реализации API. Максимально кратко.
- Лоадеры (loaders) в Android. Для чего нужны. Конспект.
- Volley vs Retrofit. Описание библиотек REST API.
- Несколько примеров на Kotlin
- Препарирование RecyclerView
- Лексикон прописных истин Android
- Xamarin.Forms. Layouts — виды
- Xamarin.Forms. Оптимизация ListView.
- Xamarin.Forms. Ускорение отображения окна (Activity)
- Платформозависимость на Xamarin
- Simple RecyclerView demo App — Stopwatch
- Оптимизация прокрутки вложенных в друг друга RecyclerView
- RecyclerView и ListView. В чем разница?
- Различные типы Item View в RecyclerView
- Препарирование RecyclerView
- RecyclerView и ListView. В чем разница?
- Xamarin.Forms. Оптимизация ListView.
В чем отличие listview от recyclerview
Элемент RecyclerView предназначен для оптимизации работы со списками и во многом позволяет повысить производительность по сравнению со стандартным ListView.
Для представления данных добавим в проект в ту же папку, где расположен класс MainActivity, новый класс Java, который назовем State :
package com.example.listapp; public class State < private String name; // название private String capital; // столица private int flagResource; // ресурс флага public State(String name, String capital, int flag)< this.name=name; this.capital=capital; this.flagResource=flag; >public String getName() < return this.name; >public void setName(String name) < this.name = name; >public String getCapital() < return this.capital; >public void setCapital(String capital) < this.capital = capital; >public int getFlagResource() < return this.flagResource; >public void setFlagResource(int flagResource) < this.flagResource = flagResource; >>
Класс State содержит поля для хранения названия и столицы страны, а также ссылку на ресурс изображения флага страны. В данном случае предполагается, что в папке res/drawable будут располагаться файлы изображений флагов для используемых стран.
Допустим, мы хотим вывести список объектов State с помощью RecyclerView . Для этого добавим в папку res/layout новый файл list_item.xml :
Этот файл определяет разметку для вывода одного объекта State.
Как и в случае с ListView, для вывода сложных объектов в RecyclerView необходимо определить свой адаптер. Поэтому добавим в ту же папку, где расположен класс MainActivity и State, новый класс Java, который назовем StateAdapter :
package com.example.listapp; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; import java.util.List; public class StateAdapter extends RecyclerView.Adapter < private final LayoutInflater inflater; private final Liststates; StateAdapter(Context context, List states) < this.states = states; this.inflater = LayoutInflater.from(context); >@Override public StateAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) < View view = inflater.inflate(R.layout.list_item, parent, false); return new ViewHolder(view); >@Override public void onBindViewHolder(StateAdapter.ViewHolder holder, int position) < State state = states.get(position); holder.flagView.setImageResource(state.getFlagResource()); holder.nameView.setText(state.getName()); holder.capitalView.setText(state.getCapital()); >@Override public int getItemCount() < return states.size(); >public static class ViewHolder extends RecyclerView.ViewHolder < final ImageView flagView; final TextView nameView, capitalView; ViewHolder(View view)< super(view); flagView = view.findViewById(R.id.flag); nameView = view.findViewById(R.id.name); capitalView = view.findViewById(R.id.capital); >> >
Адаптер, который используется в RecyclerView, должен наследоваться от абстрактного класса RecyclerView.Adapter . Этот класс определяет три метода:
- onCreateViewHolder : возвращает объект ViewHolder, который будет хранить данные по одному объекту State.
- onBindViewHolder : выполняет привязку объекта ViewHolder к объекту State по определенной позиции.
- getItemCount : возвращает количество объектов в списке
Для хранения данных в классе адаптера определен статический класс ViewHolder, который использует определенные в list_item.xml элементы управления.
Теперь определим в файле activity_main.xml элемент RecyclerView:
Следует учитывать, что RecyclerView расположен в пакете androidx.recyclerview.widget и является частью тулкита Android Jetpack , поэтому при использовании виджета указывается полное его название с учетом пакета (в принципе как и для ConstraintLayout):
Для RecyclerView следует установить атрибут app:layoutManager , который указает на тип менеджера компоновки. Менеджер компоновки представляет объект, который представлен классом LayoutManager . По умолчанию библиотека RecyclerView предоставляет три реализации данного менеджера:
- LinearLayoutManager : упорядочивает элементы в виде списка с одной колонкой
- GridLayoutManager : упорядочивает элементы в виде грида со столлбцами и строками. Грид может упорядочивать элементы по горизонтали (горизонтальный грид) или по вертикали (вертикальный грид)
- StaggeredGridLayoutManager : аналогичен GridLayoutManager, однако не требует установки для каждого элемента в строке имели одну и ту же высоту (для вертикального грида) и одну и ту же ширну (для горизонтального грида)
В данном случае с помощью значения androidx.recyclerview.widget.LinearLayoutManager указываем, что элементы будут располагаться в виде простого списка. Обратите внимание, что класс LinearLayoutManager также расположен в библиотеке RecyclerView и поэтому при указании значения указывается полное название класса с именем его пакета.
И в конце изменим класс MainActivity :
package com.example.listapp; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.RecyclerView; import android.os.Bundle; import java.util.ArrayList; public class MainActivity extends AppCompatActivity < ArrayListstates = new ArrayList(); @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // начальная инициализация списка setInitialData(); RecyclerView recyclerView = findViewById(R.id.list); // создаем адаптер StateAdapter adapter = new StateAdapter(this, states); // устанавливаем для списка адаптер recyclerView.setAdapter(adapter); >private void setInitialData() < states.add(new State ("Бразилия", "Бразилиа", R.drawable.brazilia)); states.add(new State ("Аргентина", "Буэнос-Айрес", R.drawable.argentina)); states.add(new State ("Колумбия", "Богота", R.drawable.columbia)); states.add(new State ("Уругвай", "Монтевидео", R.drawable.uruguai)); states.add(new State ("Чили", "Сантьяго", R.drawable.chile)); >>С помощью метода setInitialData() устанавливается набор начальных данных. В данном случае имеется в виду, что в папке res/drawables находится ряд ресурсов изображений для объектов State.
Как и в случае с выводом списка через ListView здесь сначала получаем элемент RecyclerView , создаем адаптер и устанавливаем адаптер для RecyclerView.
Весь проект в итоге будет выглядеть следующим образом:

В результате RecyclerView выведет набор объектов: