Académique Documents
Professionnel Documents
Culture Documents
Android - Semaine 4
Android - Semaine 4
Présentation
Android - Semaine 4
Présentation
Principe général
Schéma global
this.nom = nom;
this.distance = distance;
}}
Données initiales
privateArrayList<Planete> liste;
void onCreate(...)
{
...
liste =newArrayList<>();
for(int i=0; i<noms.length; ++i)
{ liste.add(newPlanete(noms[i], distances[i]));}
Affichage de la liste
Android - Semaine 4
Affichage de la liste
Activité
L’affichage de la liste est fait par un RecyclerView. C’est une vue qui
intègre un défilement automatique et qui veille à économiser la
mémoire pour l’affichage.
Voici le plus simple layout qui remplit tout l’écran, mais on peut
rajouter d’autres vues : boutons. . . :
<androidx.recyclerview.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recycler" android:layout_width="match_parent"
android:layout_height="match_parent"/>
En utilisant un ViewBinding:
privateArrayList<Planete> liste;
privateActivityMainBinding ui;
Adaptateurs et ViewHolders
Android - Semaine 4
Adaptateurs et ViewHolders
Concepts
Une vue qui devient invisible d’un côté, à cause du scrolling, est
renvoyée de l’autre côté, comme sur un tapis roulant, en modifiant
seulement son contenu :
ViewHolders
Exemple de ViewHolder
D’abord, il faut un layout d’item, res/layout/planete.xml:
<?xmlversion="1.0" encoding="utf-8"?>
<RelativeLayout ...>
<TextViewandroid:id="@+id/nom" .../>
<TextViewandroid:id="@+id/distance" .../>
</RelativeLayout>
publicPlaneteViewHolder(PlaneteBinding ui) {
super(ui.getRoot());
this.ui = ui;
}
publicvoid setPlanete(Planete planete) {
ui.nom.setText(planete.getNom());
ui.distance.setText(
Integer.toString(planete.getDistance()));
}
}
Android - Semaine 4
Adaptateurs et ViewHolders
1
La création du ViewBinding est faite en amont, par l’adaptateur. On ne peut
pas faire autrement car le constructeur de la superclasse ViewHolder demande une
interface déjà créée.
Android - Semaine 4
Adaptateurs et ViewHolders
publicclassPlaneteAdapter
extendsRecyclerView.Adapter<PlaneteViewHolder>
{
...constructeur ...
...surcharge des méthodes nécessaires...
}
publicclassPlaneteAdapter
extendsRecyclerView.Adapter<PlaneteViewHolder>
{
privatefinal List<Planete> liste;
Méthodes à ajouter
@Override
public int getItemCount()
{
return liste.size();
}
Android - Semaine 4
Adaptateurs et ViewHolders
@OverridepublicPlaneteViewHolder
onCreateViewHolder(ViewGroup parent, int viewType)
{
PlaneteBinding binding =
PlaneteBinding.inflate(
LayoutInflater.from(parent.getContext()),
parent,false);
returnnewPlaneteViewHolder(binding);
}
Cette méthode est appelée pour remplir un ViewHolder avec l’un des
éléments de la liste, celui qui est désigné par position(numéro dans la
liste à l’écran). C’est très facile avec lesetter.
D’autres méthodes seront ajoutées pour gérer les clics sur les
éléments.
Android - Semaine 4
Configuration de l’affichage
Configuration de l’affichage
Android - Semaine 4
Configuration de l’affichage
Optimisation du défilement
// dimensions constantes
ui.recycler.setHasFixedSize(true);
LayoutManager
// layout manager
RecyclerView.LayoutManager lm =
newLinearLayoutManager(this);
ui.recycler.setLayoutManager(lm);
<androidx.recyclerview.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recycler" android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:layoutManager=
"androidx.recyclerview.widget.LinearLayoutManager"/>
LayoutManager, suite
Disposition en tableau
// séparateur
DividerItemDecoration dividerItemDecoration =
newDividerItemDecoration(
this, DividerItemDecoration.VERTICAL);
ui.recycler.addItemDecoration(dividerItemDecoration);
Présentation
privateOnItemClickListener listener;
publicvoid setOnItemClickListener(OnItemClickListener l) {
this.listener = l;
}
...
Android - Semaine 4
Actions sur la liste
publicclassPlaneteViewHolderextendsRecyclerView.ViewHolder
implementsView.OnClickListener
{
privatefinal PlaneteBinding ui;
privatePlaneteAdapter.OnItemClickListener listener;
publicvoid setOnItemClickListener(OnItemClickListener l) {
this.listener = l;
}
...
@Overridepublicvoid onClick(View v) {
listener.onItemClick(getAdapterPosition());
}
Schéma récapitulatif