Вы часто сталкиваетесь с ситуациями, когда вам необходимо обрабатывать списки элементов при разработке мобильных приложений. Один из подходов, который вы могли бы использовать, – это использование ListView
и Адаптер массива
(если ваши данные хранятся в списке массивов
), как я объяснил в моей предыдущей статье . Это неплохой подход, но оказывается, что он подходит только для вертикальной компоновки. Поскольку я искал способ отображать элементы моего списка горизонтально и с возможностью прокрутки, используя Recyclerview
представляется одним из лучших подходов.
Что такое RecyclerView?
Если вы знакомы с ListView
, RecyclerView
является его улучшенной версией. Это позволяет нам реализовать более гибкую компоновку, а также еще эффективнее обрабатывать больший объем данных. Чтобы лучше понять RecyclerView
, давайте рассмотрим некоторые функции и требования при использовании RecyclerView
.
Для того, чтобы использовать RecyclerView
, вам нужно работать с RecyclerView. Адаптер
, Держатель для просмотра
и Менеджер компоновки
. Просмотр вторсырья. Адаптер
– это адаптер, который заполняет дочерние элементы RecyclerView
точно так же, как ArrayAdapter
. Однако для этого требуется ViewHolder
, который действует как своего рода шаблон дочернего элемента (шаблон ViewHolder). Держатель вида
удобен для адаптера, так как содержит подробную информацию о представлениях в строке. Кроме того, сначала определяя этот шаблон держателя представления, он устраняет повторяющееся использование метода findViewById()
. Это значительно избавляет нас от замедления производительности приложения при прокрутке элементов. Когда мы используем ArrayAdapter
, процесс повторного просмотра был хорошим но нам все равно нужно несколько раз вызывать метод findViewById()
для поиска элементов для обновления данных представления. По сравнению с этим использование подхода ViewHolder
определенно более эффективно.
Теперь давайте поговорим о другом ключевом игроке этой темы, LayoutManager
. Как упоминалось выше, одним из преимуществ использования Просмотр вторсырья
- горизонтальная компоновка списка , и это благодаря
Менеджеру компоновки .
Менеджер компоновки в основном отвечает за позиционирование дочерних элементов, а также за принятие решения о повторном использовании старых представлений.
RecyclerView предлагает гибкие макеты и 3 различных
Менеджер компоновки
LinearLayoutManager
: отображение элементов по вертикали или горизонталиGridLayoutManager
: отображение элементов в сетке по вертикали или горизонталиStaggeredGridLayoutManager
: отображение элементов в сетке в шахматном порядке (допускается разная ширина/высота)
Используя этих упомянутых ключевых игроков вместе, RecyclerView
может успешно эффективно создавать дочерние элементы. Теперь давайте рассмотрим подробный пример использования RecyclerView
.
Как использовать RecyclerView
В этой статье мы предполагаем, что хотим продемонстрировать список предметов в горизонтальном расположении. Каждый элемент включает в себя название темы, изображение и количество лайков. Во-первых, давайте начнем с рассмотрения представления высокого уровня о том, что нам нужно сделать:
- Определите класс модели под названием Subject для хранения всех ваших типов полей (имя темы, изображение и количество лайков).
- Заполните данные вашего субъекта и сохраните их в
ArrayList
- Определите расположение каждого элемента списка (2
TextView
s и 1Просмотр изображений
) - Создайте пользовательский
RecyclerView
иВладелец просмотра
для элементы списка витрин - Настройте пользовательский
RecyclerView
с помощьюМенеджера компоновки
и адаптера
Давайте разберемся один за другим. Сначала нам нужно определить класс под названием Subject для хранения обязательных полей и настройки методов получения.
// Subject.java public class Subject { private String subject; private int imageId; private int numOfLikes; // Constructor public Subject(String subject, int imageId, int numOfLikes){ this.subject = subject; this.imageId = imageId; this.numOfLikes = numOfLikes; } //Setting up the getter methods public String getSubject() { return subject; } public int getImageId() { return imageId; } public int getNumOfLikes() { return numOfLikes; } }
Как только у нас будет класс модели данных, давайте заполним наш ArrayList
, чтобы он содержал сведения о предметах.
// MainActivity.java ArrayListsubjectArrayList = new ArrayList<>(); subjectArrayList.add(new Subject("English", R.drawable.english, 27)); subjectArrayList.add(new Subject("Math", R.drawable.math, 13)); subjectArrayList.add(new Subject("P.E", R.drawable.pe, 45)); subjectArrayList.add(new Subject("Science", R.drawable.science, 41)); subjectArrayList.add(new Subject("Art", R.drawable.art, 36)); ....etc
Далее мы быстро настроим макет отдельного элемента. Как уже упоминалось, для примера в этой статье у нас будет 2 просмотра текста и 1 просмотр изображения. Просто обратите внимание, что если вы хотите, чтобы ваш макет был ВЕРТИКАЛЬНЫМ, будьте осторожны с высотой строки (корневой вид списка), как это необходимо wrap_content
для правильного отображения ваших товаров.
// list_item.xml
Теперь мы перейдем к нашему адаптеру пользовательских тем, который расширяет RecyclerView. Адаптер
. Пожалуйста, обратите внимание, что нам необходимо определить пользовательского владельца просмотра, чтобы указать и предоставить доступ ко всем представлениям. Это связано с тем, что мы будем использовать этот пользовательский ViewHolder
позже для привязки данных. Это также не позволяет нам вызывать методы findById()
несколько раз, когда адаптер назначает данные соответствующим представлениям.
// SubjectAdapter.java public class SubjectAdapter extends RecyclerView.Adapter{ // This is a template - give a direct reference to each view public class ViewHolder extends RecyclerView.ViewHolder{ public ImageView subjectImageView; public TextView subjectTextView; public TextView numOfLikesTextView; // Constructor - accepts entire row item public ViewHolder(@NonNull View itemView) { super(itemView); // Find each view by id you set up in the list_item.xml subjectImageView = itemView.findViewById(R.id.subject_image_view); subjectTextView = itemView.findViewById(R.id.subject_text_view); numOfLikesTextView = itemView.findViewById(R.id.likes_text_view); } } }
После настройки ViewHolder давайте начнем работать над адаптером прямо сейчас. Здесь нужно сделать 4 основные вещи: настроить конструктор и переопределить 3 различных метода, которые являются onCreateViewHolder()
, onBindViewHolder()
и getItemCount()
.
// SubjectAdapter.java public class SubjectAdapter extends RecyclerView.Adapter{ // ... ViewHolder class and its constructor as per above ArrayList list; // Constructor public SubjectAdapter(ArrayList list){ this.list = list; } // Creating a viewHolder @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // Inflate the layout View contactView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_item, parent, false); // Return a new holder instance ViewHolder viewHolder = new ViewHolder(contactView); return viewHolder; } // Assigning respective data for the views based on the position of the current item @Override public void onBindViewHolder(@NonNull SubjectAdapter.ViewHolder holder, int position) { // Get the Subject based on the current position Subject currentItem = list.get(position); // Setting views with the corresponding data ImageView imageView = holder.subjectImageView; imageView.setImageResource(currentItem.getImageId()); TextView subjectTextView = holder.subjectTextView; subjectTextView.setText(currentItem.getSubject()); TextView likesTextView = holder.numOfLikesTextView; likesTextView.setText(currentItem.getSubject()); } // Indicating how long your data is @Override public int getItemCount() { return list.size(); } }
Здесь мы начнем с настройки конструктора для адаптера. Просто передайте список данных, чтобы наш адаптер мог использовать его для заполнения элементов. Далее давайте рассмотрим метод onCreateViewHolder()
. Этот метод вызывается Менеджером компоновки
и при необходимости обрабатывает раздувание компоновки. Возвращение владельца просмотра со всеми необходимыми деталями также является его ролью. Переходя к следующему, метод onBindViewHolder()
играет решающую роль в привязке данных к соответствующим представлениям. Используя предопределенные сведения о представлении из ViewHolder
, ему удается эффективно заменять содержимое. Наконец, метод getItemCount()
– это способ сообщить адаптеру о размере ваших данных, который представляет собой общее количество элементов для демонстрации.
После прохождения описанного выше процесса все, что вам нужно сделать, это настроить Recyclerview
с вашим пользовательским адаптером и
Менеджером компоновки
// MainActivity.java // Find RecyclerView by Id (from the activity_main.xml) RecyclerView recyclerView = findViewById(R.id.recycler_view); // Instantiate SubjectAdapter with the data SubjectAdapter adapter = new SubjectAdapter(subjectsList); // Set adapter with RecyclerView recyclerView.setAdapter(adapter); // Set LayoutManager recyclerView.setLayoutManager(new LinearLayoutManager(this, RecyclerView.HORIZONTAL, false));
Здесь следует отметить одну вещь: на этот раз мы решили реализовать Linearlayoutmanager
с горизонтальной компоновкой. К счастью, он автоматически настраивается на прокрутку, если элементов много. Но если вы хотите реализовать другие стили, вы можете сделать это здесь, создав различные Менеджер компоновки
с выбранным вами размером.
Резюме
Мы рассмотрели, как использовать RecyclerView
с пользовательским RecyclerView. Адаптер
и Менеджер компоновки
. Это один из лучших подходов для эффективного отображения списка элементов. Я нашел это весьма полезным, и на самом деле он может предложить больше, например анимацию предметов. (Я напишу об этом, когда буду знать это лучше!)
Пожалуйста, не стесняйтесь оставлять комментарии, и ваши комментарии более чем приветствуются и ценятся! Спасибо за чтение 😄
Оригинал: “https://dev.to/tomokawaguchi/how-to-make-a-horizontal-layout-list-with-recyclerview-3bkc”