mobile-best-practice/chapters/MBP_014_fr.md

76 lines
3.3 KiB
Markdown

## Ne pas recharger inutilement l'ensemble du contenu d'une liste si seulement une partie a changé
### Identifiants
// TODO
### Catégories
| Cycle de vie | Tiers | Responsable |
|:---------:|:----:|:----:|
| 3. Réalisation (fabrication / développement) | Réseau | UX/UI Designer |
### Indications
| Degré de priorité | Mise en oeuvre | Impact écologique |
|:-------------------:|:-------------------------:|:---------------------:|
| 4 | 4 | 5 |
|Ressources Economisées |
|:----------------------------------------------------------:|
| Processeur / Réseau |
### Description
Si une liste qui est affichée à l'écran peut subir des modifications dans le temps, il existe des solutions permettant d'indiquer au système Android de recharger uniquement les éléments de cette liste qui ont changé, plutôt que de recharger l'ensemble de la liste.
Avec le UI Toolkit original, deux solutions sont possibles :
1. Si nous connaissons la position des éléments modifiés, la classe `RecyclerView.Adapter` fournie les fonctions suivantes :
```kotlin
notifyItemChanged(int)
notifyItemInserted(int)
notifyItemRemoved(int)
notifyItemRangeChanged(int, int)
notifyItemRangeInserted(int, int)
notifyItemRangeRemoved(int, int)
```
A contrario, il faut éviter d'utiliser la fonction `notifyDataSetChanged()` qui va forcer le rechargement complet de la liste.
2. Si le code pour déterminer la position des éléments à modifier est complexe, `ListAdapter` intègre directement un mécanisme calculant la différence entre deux listes via `DiffUtil` pour ne modifier que les éléments concernés.
Avec Jetpack Compose :
1. L'association du `key` unique a chaque élément d'une `LazyList` permet à Compose d'optimiser la réutilisation des cellules d'une liste en cas de réagencement des éléments de la liste.
```kotlin
LazyColumn {
items(
items = datas,
key = { data ->
data.id
}
) { data ->
Cell(data)
}
}
```
2. étant donné que les collections de type `List`, `Set` et `Map` sont considéré comme instable par le compilateur, une bonne pratique consiste à utiliser la bibliothèque Kotlinx immutable collections ou d'annoter les paramètres de type liste par `@Immutable` ou `@Stable`. Cela permet de garantir au compilateur de la stabilité des paramètres et ainsi de réduire le nombre de recomposition inutile.
### Exemple
* [Article](https://medium.com/androiddevelopers/adapting-to-listadapter-341da4218f5b) expliquant la mise en place de `ListAdapter`
* [Lazy list keys - Jetpack Compose - Documentation](https://developer.android.com/develop/ui/compose/lists#item-keys)
* [Stabilité - Jetpack Compose - Documentation](https://developer.android.com/develop/ui/compose/performance/stability#summary)
### Principe de validation
| Le nombre ... | est inférieur ou égal à |
|-------------------------------------------------------------------------------------------|:-------------------------:|
| d'écran utilisant la fonction `notifyDataSetChanged` pour recharger les données d'une liste | 0% |
| de recomposition inutile d'une liste | 0% |