Propriété de Albiri Sigue
customer 27921 at Fri Mar 11 19:19:45 +0100 2011
Chapitre 9
S’amuser avec les listes 91
second examen de votre code. Ne tentez pas de tout régler d’un coup, sous peine de vous
noyer dans un océan de View.
Utilisation du patron de conception "support"
L’appel de findViewById() est également coûteux : cette méthode plonge dans les lignes
de la liste pour en extraire les widgets en fonction de leurs identifiants, afin que l’on puisse
en personnaliser le contenu (pour modifier le texte d’un TextView, changer l’icône d’un
ImageView, par exemple).
findViewById() pouvant trouver n’importe quel widget dans l’arbre des fils de la View
racine de la ligne, cet appel peut demander un certain nombre d’instructions pour
s’exécuter, notamment si l’on doit retrouver à nouveau des widgets que l’on a déjà trouvés
auparavant.
Certains kits de développement graphiques évitent ce problème en déclarant les View
composites, comme nos lignes, dans le code du programme (en Java, ici). L’accès aux
différents widgets ne consiste plus, alors, qu’à appeler une méthode d’accès ou à lire un
champ. Nous pourrions bien sûr faire de même avec Android, mais cela alourdirait le code.
Nous préférons trouver un moyen de continuer à utiliser le fichier de description XML tout
en mettant en cache les widgets fils essentiels de notre ligne, afin de ne devoir les rechercher
qu’une seule fois.
C’est là qu’entre en jeu le patron de conception "support", qui est implémenté par une
classe que nous appellerons ViewWrapper.
Tous les objets View disposent des méthodes getTag() et setTag(), qui permettent
d’associer un objet quelconque au widget. Le patron "support" utilise ce "marqueur" pour
détenir un objet qui, à son tour, détient chaque widget fils intéressant. En attachant le
support à l’objet View de la ligne, on a accès immédiatement aux widgets fils qui nous
intéressent à chaque fois que l’on utilise cette ligne, sans devoir appeler à nouveau findViewById().
Examinons l’une de ces classes support (extrait du projet FancyLists/ViewWrapper) :
class ViewWrapper {
View base;
TextView label=null;
ImageView icon=null;
ViewWrapper(View base) {
this.base=base;
}
TextView getLabel() {
if (label==null) {
label=(TextView)base.findViewById(R.id.label);
}
Livre Android.book Page 91 Dimanche, 8. novembre 2009 12:23 12
Précédent

- 106/391

Suivant