Cet atelier de programmation fait partie du cours Principes de base d'Android en Kotlin. Vous tirerez pleinement parti de ce cours en suivant les ateliers de programmation dans l'ordre. Tous les ateliers de programmation du cours sont listés sur la page de destination des ateliers de programmation Principes de base d'Android en Kotlin.
Introduction
L'un des principaux atouts de RecyclerView
est qu'il vous permet d'utiliser des gestionnaires de mise en page pour contrôler et modifier votre stratégie de mise en page. Un LayoutManager
gère la disposition des éléments dans RecyclerView
.
RecyclerView
est fourni avec des gestionnaires de mise en page prêts à l'emploi pour les cas d'utilisation courants. Par exemple, vous pouvez utiliser LinearLayout
pour les listes horizontales et verticales, ou GridLayout
pour les grilles. Pour les cas d'utilisation plus complexes, vous devez implémenter un LayoutManager
personnalisé.
Dans cet atelier de programmation, vous allez apprendre à afficher des données à l'aide d'une mise en page en grille au lieu d'une liste, en vous appuyant sur l'application de suivi du sommeil de l'atelier de programmation précédent. (Si vous n'avez pas l'application de l'atelier de programmation précédent, vous pouvez télécharger le code de démarrage pour cet atelier de programmation.)
Ce que vous devez déjà savoir
Vous devez maîtriser les éléments suivants :
- Créer une interface utilisateur de base à l'aide d'un
Activity
, d'unFragments
et d'unViews
- Naviguer entre les fragments et utiliser
safeArgs
pour transmettre des données entre les fragments - Afficher les modèles, les fabriques de modèles et les transformations
LiveData
et ses observateurs- Créer une base de données
Room
, un DAO et définir des entités - Utiliser des coroutines pour les tâches de base de données et autres tâches de longue durée
- Implémenter un
RecyclerView
de base avec une mise en pageAdapter
,ViewHolder
et d'élément - Implémenter la liaison de données pour
RecyclerView
- Créer et utiliser des adaptateurs de liaison pour transformer des données
Points abordés
- Utiliser un autre
LayoutManager
pour modifier l'affichage de vos données dans leRecyclerView
- Créer une mise en page en grille pour vos données de sommeil
Objectifs de l'atelier
- Utilisez l'application de suivi du sommeil de l'atelier de programmation précédent de cette série.
- Remplacez la liste des données sur le sommeil affichée par
RecyclerView
dans l'application par une grille de données sur le sommeil.
L'application de suivi du sommeil comporte deux écrans, représentés par des fragments, comme illustré dans la figure ci-dessous.
Le premier écran, affiché à gauche, comporte des boutons permettant de démarrer et d'arrêter le suivi. L'écran affiche certaines données de sommeil de l'utilisateur. Le bouton Effacer supprime définitivement toutes les données que l'application a collectées pour l'utilisateur. Le deuxième écran, à droite, permet de sélectionner une note de qualité du sommeil.
Cette application utilise une architecture simplifiée avec un contrôleur d'UI, un ViewModel et LiveData
, ainsi qu'une base de données Room
pour conserver les données de sommeil.
Les données sur le sommeil sont affichées dans un RecyclerView
. Dans cet atelier de programmation, vous allez modifier l'application pour qu'elle utilise un GridLayout
. L'écran final ressemblera à la capture d'écran ci-dessous.
Dans un atelier de programmation précédent, lorsque vous avez ajouté RecyclerView
à fragment_sleep_tracker.xml
, vous avez ajouté un LinearLayoutManager
sans aucune personnalisation. Ce code affiche les données sous forme de liste verticale.
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
LinearLayoutManager
est le gestionnaire de mise en page le plus courant et le plus simple pour RecyclerView
. Il est compatible avec le placement horizontal et vertical des vues enfants. Par exemple, vous pouvez utiliser LinearLayoutManager
pour créer un carrousel d'images que l'utilisateur fait défiler horizontalement.
GridLayout
Un autre cas d'utilisation courant consiste à afficher de nombreuses données à l'utilisateur, ce que vous pouvez faire à l'aide de GridLayout
. Le GridLayoutManager
pour RecyclerView
présente les données sous la forme d'une grille que l'utilisateur peut faire défiler, comme illustré ci-dessous.
Du point de vue du design, GridLayout
est idéal pour les listes qui peuvent être représentées par des icônes ou des images, comme les listes dans une application de navigation photo. Dans l'application de suivi du sommeil, vous pouvez afficher chaque nuit de sommeil sous forme de grille d'icônes de grande taille. Cette conception permet à l'utilisateur d'obtenir un aperçu de la qualité de son sommeil en un coup d'œil.
Fonctionnement de GridLayout
GridLayout
organise les éléments dans une grille de lignes et de colonnes. En cas de défilement vertical, chaque élément d'une ligne occupe un "segment". (Dans ce cas, un segment équivaut à la largeur d'une colonne.)
Dans les deux premiers exemples ci-dessous, chaque ligne est composée de trois segments. Par défaut, le gestionnaire GridLayoutManager
assigne chaque élément dans un segment, dans la limite du nombre de segments que vous indiquez. Lorsqu'il atteint ce nombre, il envoie le segment suivant à la ligne suivante.
Par défaut, chaque élément occupe un segment, mais vous pouvez l'élargir en spécifiant le nombre de segments qu'il doit occuper. Par exemple, l'élément supérieur de l'écran le plus à droite (ci-dessous) occupe trois spans.
Dans cette tâche, vous allez prendre le RecyclerView
que vous avez terminé dans le dernier exercice et le mettre à jour pour afficher les données à l'aide d'un GridLayoutManager
. Vous pouvez continuer à utiliser l'application de suivi du sommeil de l'atelier de programmation précédent ou télécharger l'application RecyclerViewGridLayout-Starter depuis GitHub.
Étape 1 : Modifiez le LayoutManager
- Si nécessaire, téléchargez l'application RecyclerViewGridLayout-Starter pour cet atelier de programmation depuis GitHub et ouvrez le projet dans Android Studio.
- Ouvrez le fichier de mise en page
fragment_sleep_tracker.xml
. - Supprimez le gestionnaire de mise en page de la définition
RecyclerView
sleep_list
.
Code à supprimer :
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager
- Ouvrez
SleepTrackerFragment.kt
. - Dans
OnCreateView()
, juste avant l'instructionreturn
, créez unGridLayoutManager
vertical de haut en bas avec trois étendues.
Le constructeurGridLayoutManager
accepte jusqu'à quatre arguments : un contexte, qui estactivity
, le nombre d'étendues (colonnes, dans la mise en page verticale par défaut), une orientation (par défaut, verticale) et une indication précisant s'il s'agit d'une mise en page inversée (par défaut,false
).
val manager = GridLayoutManager(activity, 3)
- Sous cette ligne, indiquez à
RecyclerView
d'utiliser ceGridLayoutManager
.RecyclerView
se trouve dans l'objet de liaison et s'appellesleepList
. (Voirfragment_sleep_tracker.xml
.)
binding.sleepList.layoutManager = manager
Étape 2 : Modifier la mise en page
La mise en page actuelle de list_item_sleep_night.xml
affiche les données en utilisant une ligne entière par nuit. Au cours de cette étape, vous allez définir une mise en page d'élément carré plus compacte pour la grille.
- Ouvrez
list_item_sleep_night.xml
. - Supprimez le
TextView
sleep_length
, car le nouveau design n'en a pas besoin. - Déplacez
quality_string
TextView
pour qu'il s'affiche sousImageView
. Pour ce faire, vous devez mettre à jour plusieurs éléments. Voici la mise en page finale de l'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}" />
- Dans la vue Design (Conception), vérifiez que le
TextView
quality_string
est positionné sous leImageView
.
Comme vous avez utilisé la liaison de données, vous n'avez rien à modifier dans Adapter
. Le code devrait fonctionner et votre liste devrait s'afficher sous forme de grille.
- Exécutez l'application et observez comment les données de sommeil sont affichées dans une grille.
Notez queConstraintLayout
occupe toujours toute la largeur.GridLayoutManager
donne à votre vue une largeur fixe, basée sur son étendue.GridLayoutManager
fait de son mieux pour respecter toutes les contraintes lors de la mise en page de la grille, de l'ajout d'espaces blancs ou du découpage des éléments.
- Dans
SleepTrackerFragment
, dans le code qui créeGridLayoutManager
, remplacez le nombre d'étendues pourGridLayoutManger
par 1. Exécutez l'application pour obtenir une liste.
val manager = GridLayoutManager(activity, 1)
- Définissez le nombre d'étendues de
GridLayoutManager
sur 10 et exécutez l'application. Vous remarquerez queGridLayoutManager
peut contenir 10 éléments sur une ligne, mais que les éléments sont désormais coupés. - Définissez le nombre d'étendues sur 5 et la direction sur
GridLayoutManager.VERTICAL
. Exécutez l'application et remarquez comment vous pouvez faire défiler l'écran horizontalement. Vous aurez besoin d'une autre mise en page pour que cela soit esthétique.
val manager = GridLayoutManager(activity, 5, GridLayoutManager.HORIZONTAL, false)
- N'oubliez pas de redéfinir le nombre de spans sur 3 et l'orientation sur "vertical" !
Projet Android Studio : RecyclerViewGridLayout
- Les gestionnaires de mise en page gèrent la façon dont les éléments du
RecyclerView
sont organisés. RecyclerView
est fourni avec des gestionnaires de mise en page prêts à l'emploi pour les cas d'utilisation courants, tels queLinearLayout
pour les listes horizontales et verticales, etGridLayout
pour les grilles.- Pour les cas d'utilisation plus complexes, implémentez un
LayoutManager
personnalisé. - Du point de vue de la conception,
GridLayout
est idéal pour les listes d'éléments pouvant être représentés par des icônes ou des images. GridLayout
organise les éléments dans une grille de lignes et de colonnes. En cas de défilement vertical, chaque élément d'une ligne occupe un "segment".- Vous pouvez personnaliser le nombre de colonnes qu'occupe un élément, ce qui permet de créer des grilles plus intéressantes sans avoir besoin d'un gestionnaire de mise en page personnalisé.
- Créez une mise en page pour un élément de la grille, et le gestionnaire de mise en page s'occupe d'organiser les éléments.
- Vous pouvez définir le
LayoutManager
pour leRecyclerView
dans le fichier de mise en page XML contenant l'élément<RecyclerView>
ou par programmation.
Cours Udacity :
- Développer des applications Android avec Kotlin
- Kotlin Bootcamp for Programmers (Formation Kotlin pour les programmeurs)
Documentation pour les développeurs Android :
Cette section répertorie les devoirs possibles pour les élèves qui suivent cet atelier de programmation dans le cadre d'un cours animé par un enseignant. Il revient à l'enseignant d'effectuer les opérations suivantes :
- Attribuer des devoirs si nécessaire
- Indiquer aux élèves comment rendre leurs devoirs
- Noter les devoirs
Les enseignants peuvent utiliser ces suggestions autant qu'ils le souhaitent, et ne doivent pas hésiter à attribuer d'autres devoirs aux élèves s'ils le jugent nécessaire.
Si vous suivez cet atelier de programmation par vous-même, n'hésitez pas à utiliser ces devoirs pour tester vos connaissances.
Répondre aux questions suivantes
Question 1
Parmi les éléments suivants, quels sont les gestionnaires de mise en page fournis par Android ? Plusieurs réponses possibles.
▢ LinearLayouManager
▢ GridLayoutManager
▢ CircularLayoutManager
▢ StaggeredGridLayoutManager
Question 2
Qu'est-ce qu'une "étendue" ?
▢ La taille d'une grille créée par GridLayoutManager
.
▢ La largeur d'une colonne dans la grille.
▢ Les dimensions d'un élément d'une grille.
▢ Le nombre de colonnes dans une grille à orientation verticale.
Passez à la leçon suivante :