В Android, начиная с версии 5.0, доступны новые View-элементы экрана, которые упрощают работу со списками: RecyclerView и CardView. С помощью этих компонентов приложение будет выглядеть и вести себя в соответствии с рекомендациями Google Material Design.
Виджет RecylerView является более совершенной и гибкой версией ListView.
В модели RecyclerView вывод данных обеспечивают несколько разных компонентов. Общим контейнером для вывода информации является объект RecyclerView, который вам необходимо добавить в макет. RecyclerView заполняет себя представлениями, которые предоставляются layout manager, который вы предоставляете. Вы можете использовать один из стандартных layout manager, или реализовать собственный.
Представления в списке представлены объектами view holder. Эти объекты являются экземплярами класса, который вы определяете с помощью наследования класса RecyclerView.ViewHolder. Каждый view holder ответственный за вывод одного пункта списка. К приему, если ваш список выводит музыкальную коллекцию, то каждый view holder отвечает за вывод одного альбома. RecyclerView создает столько объектов view holder, сколько помещается в видимую часть списка, плюс несколько дополнительных объектов. Когда пользователь осуществляет прокрутку списка, RecyclerView повторно использует объекты view holder, которые вышли за пределы видимой части списка.
Объекты view holder управляются адаптером, который создается разработчиком с помощью наследования от класса RecyclerView.Adapter. Адаптер создает требуемое количество объектов view holder. Адаптер также осуществляет привязку объектов view holder к данным с помощью метода onBindViewHolder(). В метод передается позиция объекта view holder в списке, чтобы определить - какими данными необходимо заполнить view holder.
Для подключения элементов CardView и RecyclerView, мы должны добавить соответствующие библиотеки
Получим ссылку на объект RecyclerView. Если вы уверены, что размер RecyclerView не будет изменяться, вы можете вызвать метод setHasFixedSize(true).
В отличие от ListView, RecyclerView необходим менеджер компоновки для управления позиционированием своих элементов. Можно определить свой собственный LayoutManager , расширяя класс RecyclerView.LayoutManager. Однако в большинстве случаев, вы могли бы просто использовать один из стандартных подклассов LayoutManager :
LinearLayoutManager
GridLayoutManager
StaggeredGridLayoutManager
В нашем примере мы будем использовать LinearLayoutManager. По умолчанию он обеспечивает вид RecyclerView аналогично ListView.
Аналогично ListView, в RecyclerView нужен адаптер для доступа к его данным. Чтобы создать адаптер для RecyclerView, наследуемся от RecyclerView.Adapter. Этот адаптер представляет шаблон проектирования viewholder, подразумевающий использование пользовательского класса, который расширяет RecyclerView.ViewHolder. Этот паттерн сводит к минимуму количество обращений к дорогостоящему в плане ресурсов методу findViewById.
Ранее мы уже определили XML-файл макета для CardView, представляющего пункт списка. Мы собираемся использовать этот макет сейчас. Внутри конструктора собственного ViewHolder, инициализируем View, входящие в RecyclerView.
RecyclerView.Adapter имеет три абстрактных метода, которые мы должны переопределить. Давайте начнем с метода getItemCount. Он вернет количество элементов, присутствующих в данных. Так как наши данные в виде списка, мы просто вызываем метод size у объекта списка:
Далее, следует переопределить метод onCreateViewHolder. Как следует из названия, этот метод вызывается, когда наш ViewHolder должен быть инициализирован. Мы указываем макет для каждого элемента RecyclerView. Затем LayoutInflater заполняет макет, и передает его в конструктор ViewHolder.
@NonNull@OverridepublicPersonViewHolderonCreateViewHolder(@NonNullViewGroup viewGroup,int i) {View v =LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_item, viewGroup,false);v.getBackground().setAlpha(0);PersonViewHolder holder =newPersonViewHolder(v);return holder;}
Переопределим onBindViewHolder и определим содержание каждого элемента из RecyclerView. Этот метод очень похож на метод getView элемента адаптера ListView. В нашем примере, здесь вы должны установить значение текстового поля и ресурс изображения
Теперь, когда адаптер готов, добавляем код для создания и использования адаптера, вызывая конструктор адаптера и отдавая его методу setAdapter нашего RecyclerView: