Эта кодовая лаборатория является частью курса Android Kotlin Fundamentals. Вы получите максимальную отдачу от этого курса, если будете последовательно работать с лабораториями кода. Все кодовые лаборатории курса перечислены на целевой странице кодовых лабораторий Android Kotlin Fundamentals .
Введение
Одна из основных сильных сторон RecyclerView
заключается в том, что он позволяет использовать менеджеры компоновки для контроля и изменения стратегии компоновки. LayoutManager
управляет расположением элементов в RecyclerView
.
RecyclerView
поставляется с готовыми менеджерами компоновки для распространенных случаев использования. Например, вы можете использовать LinearLayout
для горизонтальных и вертикальных списков или GridLayout
для сеток. Для более сложных вариантов использования вам необходимо реализовать собственный LayoutManager
.
В этой лаборатории кода вы узнаете, как отображать данные, используя макет сетки вместо списка, опираясь на приложение для отслеживания сна из предыдущей лаборатории кода. (Если у вас нет приложения из предыдущей лаборатории кода, вы можете загрузить начальный код для этой лаборатории кода.)
Что вы уже должны знать
Вы должны быть знакомы с:
- Создание базового пользовательского интерфейса с использованием
Activity
,Fragments
иViews
- Навигация между фрагментами и использование
safeArgs
для передачи данных между фрагментами - Просмотр моделей, просмотр фабрик моделей и преобразований
-
LiveData
и их наблюдатели - Как создать базу данных
Room
, создать DAO и определить сущности - Как использовать сопрограммы для задач базы данных и других длительных задач
- Как реализовать базовый
RecyclerView
сAdapter
,ViewHolder
и макетом элемента - Как реализовать привязку данных для
RecyclerView
- Как создавать и использовать адаптеры привязки для преобразования данных
Что вы узнаете
- Как использовать другой
LayoutManager
, чтобы изменить способ отображения ваших данных вRecyclerView
- Как создать сетку для данных о сне
Что ты будешь делать
- Создайте приложение для отслеживания сна из предыдущей кодовой лаборатории в этой серии.
- Замените список данных о сне, отображаемых
RecyclerView
в приложении, сеткой данных о сне.
Приложение для отслеживания сна имеет два экрана, представленных фрагментами, как показано на рисунке ниже.
Первый экран, показанный слева, имеет кнопки для запуска и остановки отслеживания. На экране показаны некоторые данные о сне пользователя. Кнопка « Очистить » безвозвратно удаляет все данные, которые приложение собрало для пользователя. Второй экран, показанный справа, предназначен для выбора оценки качества сна.
Это приложение использует упрощенную архитектуру с контроллером пользовательского интерфейса, моделью представления и LiveData
, а также базу данных Room
для сохранения данных о сне.
Данные о сне отображаются в RecyclerView
. В этой кодовой лаборатории вы изменяете приложение для использования GridLayout
. Финальный экран будет выглядеть, как на скриншоте ниже.
В предыдущей кодовой лаборатории при добавлении RecyclerView
в fragment_sleep_tracker.xml
вы добавляли LinearLayoutManager
без каких-либо настроек. Этот код отображает данные в виде вертикального списка.
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
LinearLayoutManager
— наиболее распространенный и простой менеджер компоновки для RecyclerView
, который поддерживает как горизонтальное, так и вертикальное размещение дочерних представлений. Например, вы можете использовать LinearLayoutManager
для создания карусели изображений, которую пользователь прокручивает горизонтально.
Макет сетки
Другим распространенным вариантом использования является необходимость показать пользователю много данных, что вы можете сделать с помощью GridLayout
. GridLayoutManager
для RecyclerView
размещает данные в виде прокручиваемой сетки, как показано ниже.
С точки зрения дизайна GridLayout
лучше всего подходит для списков, которые могут быть представлены в виде значков или изображений, например списков в приложении для просмотра фотографий. В приложении для отслеживания сна вы можете отображать каждую ночь сна в виде сетки больших значков. Этот дизайн даст пользователю обзор качества своего сна с первого взгляда.
Как GridLayout размещает элементы
GridLayout
упорядочивает элементы в виде сетки строк и столбцов. При вертикальной прокрутке по умолчанию каждый элемент в строке занимает один «промежуток». (В этом случае один интервал эквивалентен ширине одного столбца.)
В первых двух примерах, показанных ниже, каждая строка состоит из трех интервалов. По умолчанию GridLayoutManager
каждый элемент в одном интервале до указанного вами количества интервалов. Когда он достигает количества интервалов, он переносится на следующую строку.
По умолчанию каждый элемент занимает один интервал, но вы можете сделать элемент шире, указав, сколько интервалов он должен занимать. Например, верхний элемент на крайнем правом экране (показанном ниже) занимает три интервала.
В этой задаче вы берете RecyclerView
, созданный в предыдущем упражнении, и обновляете его для отображения данных с помощью GridLayoutManager
. Вы можете продолжить использовать приложение для отслеживания сна из предыдущей лаборатории кода или загрузить приложение RecyclerViewGridLayout-Starter с GitHub.
Шаг 1. Измените LayoutManager
- При необходимости загрузите приложение RecyclerViewGridLayout-Starter для этой лаборатории кода с GitHub и откройте проект в Android Studio.
- Откройте файл макета
fragment_sleep_tracker.xml
. - Удалите менеджер компоновки из определения
sleep_list
RecyclerView
.
Код для удаления:
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager
- Откройте
SleepTrackerFragment.kt
. - В
OnCreateView()
непосредственно перед операторомreturn
создайте новый вертикальныйGridLayoutManager
сверху вниз с 3 интервалами.
КонструкторGridLayoutManager
принимает до четырех аргументов: контекст, который являетсяactivity
, числовые интервалы (столбцы в вертикальном макете по умолчанию), ориентация (по умолчанию — вертикальная) и является ли это обратным макетом (по умолчанию —false
).
val manager = GridLayoutManager(activity, 3)
- Ниже этой строки скажите
RecyclerView
использовать этотGridLayoutManager
.RecyclerView
находится в объекте привязки и называетсяsleepList
. (См.fragment_sleep_tracker.xml
.)
binding.sleepList.layoutManager = manager
Шаг 2. Измените макет
Текущий макет в list_item_sleep_night.xml
отображает данные, используя целую строку за ночь. На этом этапе вы определяете более компактный макет квадратного элемента для сетки.
- Откройте
list_item_sleep_night.xml
. - Удалите
sleep_length
TextView
, потому что новый дизайн не нужен. - Переместите элемент
TextView
quality_string
так, чтобы он отображался под элементомImageView
. Для этого вам нужно обновить довольно много вещей. Вот окончательный макет дляquality_string
TextView
:
<TextView
android:id="@+id/quality_string"
android:layout_width="0dp"
android:layout_height="20dp"
android:textAlignment="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/quality_image"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/quality_image"
app:layout_constraintTop_toBottomOf="@+id/quality_image"
tools:text="Excellent!!!"
app:sleepQualityString="@{sleep}" />
- Убедитесь в представлении « Дизайн» , что
TextView
quality_string
расположен нижеImageView
.
Поскольку вы использовали привязку данных, вам не нужно ничего менять в Adapter
. Код должен просто работать, и ваш список должен отображаться в виде сетки.
- Запустите приложение и посмотрите, как данные о сне отображаются в виде сетки.
Обратите внимание, чтоConstraintLayout
по-прежнему занимает всю ширину.GridLayoutManager
дает вашему представлению фиксированную ширину в зависимости от его диапазона.GridLayoutManager
делает все возможное, чтобы соблюсти все ограничения при компоновке сетки, добавлении пробелов или вырезании элементов.
- В
SleepTrackerFragment
в коде, создающемGridLayoutManager
, измените количество диапазонов дляGridLayoutManger
на 1. Запустите приложение, и вы получите список.
val manager = GridLayoutManager(activity, 1)
- Измените количество диапазонов для
GridLayoutManager
на 10 и запустите приложение. Обратите внимание, чтоGridLayoutManager
10 элементов в строке, но теперь они обрезаны. - Измените количество промежутков на 5 и направление на
GridLayoutManager.VERTICAL
. Запустите приложение и обратите внимание, как вы можете прокручивать по горизонтали. Вам понадобится другой макет, чтобы это выглядело хорошо.
val manager = GridLayoutManager(activity, 5, GridLayoutManager.HORIZONTAL, false)
- Не забудьте установить количество промежутков обратно на 3 и ориентацию на вертикальную!
Проект Android Studio: RecyclerViewGridLayout
- Менеджеры компоновки управляют расположением элементов в
RecyclerView
. -
RecyclerView
поставляется с готовыми менеджерами компоновки для распространенных случаев использования, такими какLinearLayout
для горизонтальных и вертикальных списков иGridLayout
для сеток. - Для более сложных вариантов использования реализуйте собственный
LayoutManager
. - С точки зрения дизайна
GridLayout
лучше всего использовать для списков элементов, которые могут быть представлены в виде значков или изображений. -
GridLayout
упорядочивает элементы в виде сетки строк и столбцов. При вертикальной прокрутке каждый элемент в строке занимает так называемый «промежуток». - Вы можете настроить количество промежутков, занимаемых элементом, создавая более интересные сетки без необходимости использования специального менеджера компоновки.
- Создайте макет элемента для одного элемента в сетке, а менеджер макета позаботится о размещении элементов.
- Вы можете установить
LayoutManager
дляRecyclerView
либо в XML-файле макета, который содержит элемент<RecyclerView>
, либо программно.
Удасити курсы:
Документация для разработчиков Android:
В этом разделе перечислены возможные домашние задания для студентов, которые работают с этой кодовой лабораторией в рамках курса, проводимого инструктором. Инструктор должен сделать следующее:
- При необходимости задайте домашнее задание.
- Объясните учащимся, как сдавать домашние задания.
- Оценивайте домашние задания.
Преподаватели могут использовать эти предложения так мало или так часто, как они хотят, и должны свободно давать любые другие домашние задания, которые они считают подходящими.
Если вы работаете с этой кодовой лабораторией самостоятельно, не стесняйтесь использовать эти домашние задания, чтобы проверить свои знания.
Ответьте на эти вопросы
Вопрос 1
Какие из перечисленных ниже менеджеров компоновки предоставляются Android? Выбрать все, что подходит.
▢ LinearLayouManager
GridLayoutManager
Диспетчер макетов сетки
CircularLayoutManager
Диспетчер кругового макета
▢ StaggeredGridLayoutManager
вопрос 2
Что такое "пролёт"?
▢ Размер сетки, созданной GridLayoutManager
.
▢ Ширина столбца в сетке.
▢ Размеры элемента в сетке.
▢ Количество столбцов в сетке с вертикальной ориентацией.
Начать следующий урок: