Как работать с RecyclerView?

RecyclerView — это компонент пользовательского интерфейса, который позволяет нам создавать прокручиваемый список. Он был представлен в Android Lollipop, и это своего рода ListView2.

Если у нас есть возможность, то мы должны использовать его вместо ListView, потому что он заставляет нас использовать более эффективный способ реализации списка и разделяет зоны ответственности между классами.

Чтобы реализовать RecyclerView, мы должны создать следующие компоненты:

— RecyclerView, который мы должны добавить в layout нашего экрана;

layout для каждой строки списка;

— адаптер, который содержит данные и связывает их со списком.

Как создать RecyclerView?

Прежде чем мы это сделаем, нам нужно добавить зависимость в build.gradle файл.

    dependencies {
        implementation 'com.android.support:recyclerview-v7:27.0.0'
    }

Не забудьте обновить версию библиотеки до последней. Вы можете проверить её здесь.

Теперь мы можем добавить RecyclerView в layout.

 

Рисунок 1. Добавление RecyclerView в layout activity_main.xlm

 

Рисунок 2. Создание RecyclerView в Activity

 

В созданном экземпляре RecyclerView мы должны установить LayoutManager. Следуя документации:

LayoutManager отвечает за позиционирование view-компонентов в RecyclerView, а также за определение того, когда следует переиспользовать view-компоненты, которые больше не видны пользователю.

Таким образом, это означает, что LayoutManager отображает список в определённой форме. В этом примере мы использовали LinearLayoutManager, который показывает данные в простом списке — вертикальном или горизонтальном (по умолчанию вертикальном). Но это можно очень просто изменить, использовав другой LayoutManager. Например GridLayoutManager, StaggeredGridLayoutManager или WearableLinearLayoutManager.

Отлично, теперь мы создадим layout для каждой строки списка.

Как создать layout для строки списка?

Так же как и любой другой layout.

 

Рисунок 3. Создание layout для строки списка

 

layout строки списка довольно прост — некоторое изображение и текст рядом с ним. Чтобы сделать это, мы использовали LinearLayout с горизонтальной ориентацией. Обратите внимание на предупреждение на LinearLayout. Оно говорит нам о том, что мы должны спроектировать наш layout более эффективным способом.

 

Рисунок 4. Предупреждающее сообщение Android Studio

 

В этом случае мы могли бы использовать атрибут android:drawableStart в TextView, но тогда изображение должно было бы иметь надлежащий размер. С другой стороны, ImageView дает мне больше возможностей, и я смог легко изменить размер изображения — я хотел сделать это как можно проще.

В LinearLayout используется атрибут android:padding. Если вы не знакомы с этим атрибутом, вы можете взглянуть на мою короткую статью об этом.

Теперь мы должны создать адаптер.

Как создать адаптер?

Рисунок 5. Пример адаптера RecyclerView

 

Мы должны создать класс, который расширяет RecyclerView.Adapter, который в качестве параметра принимает класс, который расширяет RecyclerView.ViewHolder. Также необходимо переопределить некоторые требуемые методы.

Что делают эти методы?

getItemCount() возвращает общее количество элементов списка. Значения списка передаются с помощью конструктора.

onCreateViewHolder() создает новый объект ViewHolder всякий раз, когда RecyclerView нуждается в этом. Это тот момент, когда создаётся layout строки списка, передается объекту ViewHolder, и каждый дочерний view-компонент может быть найден и сохранен.

onBindViewHolder() принимает объект ViewHolder и устанавливает необходимые данные для соответствующей строки во view-компоненте.

Весь код выглядит так.

 

Рисунок 6. Пример реализации RecyclerView

 

Можем запустить проект и увидеть результат.

 

Рисунок 7. Пример прокручиваемого списка с использованием RecyclerView

 

Почему нам нужен паттерн ViewHolder?

Короче говоря, ViewHolder предотвращает ненужные вызовы findViewById(). Если вы не знакомы с этим шаблоном, я рекомендую вам взглянуть на мой пример реализации списка с помощью ListView. Я считаю, что это лучший способ узнать, для чего необходим этот паттерн и какие потенциальные проблемы он решает.

Если layout строки списка не создаётся для каждой строки, тогда сколько раз на самом деле он создаётся? Сколько раз вызываются методы onCreateViewHolder() и onBindViewHolder()?

Как RecyclerView переиспользует view-компоненты?

Чтобы проверить это, мы поместим несколько логов в наш код.

 

Рисунок 8. Использование Log-класса для анализа переиспользования элементов списка

 

Хорошо, давайте посмотрим, что происходит.

 

Рисунок 9. Пример вызова методов onCreateViewHolder () и onBindViewHolder ()

 

Как вы видите, вызывается метод onCreateViewHolder() и объекты ViewHolder создаются для нескольких первых view-компонентов, а затем они переиспользуются, и адаптер просто привязывает данные при помощи метода onBindViewHolder(). Благодаря этому список очень эффективен, и пользователь может прокручивать список плавно, потому что наиболее тяжёлые операции (создание и поиск элементов view-компонентов) происходят внутри метода onCreateViewHolder().

Вот и всё!

Перевод — [Оригинальная статья]

Урок создан: 27 ноября 2017 | Просмотров: 452 | Автор: Павел Абрамов | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

Комментариев пока нет, будьте первым.