Propriété de Albiri Sigue
customer 27921 at Fri Mar 11 19:19:45 +0100 2011
90 L’art du développement Android
public View getView(int position, View convertView,
ViewGroup parent) {
View row=convertView;
if (row==null) {
LayoutInflater inflater=context. getLayoutInflater();
row=inflater.inflate(R.layout.row, null);
}
TextView label=(TextView)row.findViewById(R.id.label);
label.setText(items[position]);
ImageView icon=(ImageView)row.findViewById(R.id.icon);
if (items[position].length()>4) {
icon.setImageResource(R.drawable.delete);
}
else {
icon.setImageResource(R.drawable.ok);
}
return(row);
}
}
}
Si convertView est null, nous créons une ligne par inflation ; dans le cas contraire, nous
nous contentons de la réutiliser. Le code pour remplir les contenus (image de l’icône, texte
du label) est identique dans les deux cas. On évite ainsi une étape d’inflation potentiellement
coûteuse lorsque convertView n’est pas null.
Cependant, cette approche ne fonctionne pas toujours. Si, par exemple, une ListView
comprend des lignes ne contenant qu’une seule ligne de texte et d’autres en contenant
plusieurs, la réutilisation des lignes existantes devient problématique car les layouts
risquent d’être très différents. Si l’on doit créer une View pour une ligne qui compte deux
lignes de texte, par exemple, on ne peut pas se contenter de réutiliser une View avec une
seule ligne : il faut soit modifier les détails internes de cette View, soit l’ignorer et en créer
une nouvelle.
Il existe bien entendu des moyens de gérer ce type de problème, comme rendre la seconde
ligne de texte visible ou non en fonction des besoins, mais n’oubliez pas que chaque milliseconde d’utilisation du CPU d’un téléphone est précieuse – pour la fluidité de l’interface,
mais surtout pour la batterie.
Ceci étant dit, surtout si vous débutez avec Android, intéressez-vous d’abord à obtenir la
fonctionnalité que vous désirez et essayez ensuite d’optimiser les performances lors d’un
Livre Android.book Page 90 Dimanche, 8. novembre 2009 12:23 12
customer 27921 at Fri Mar 11 19:19:45 +0100 2011
90 L’art du développement Android
public View getView(int position, View convertView,
ViewGroup parent) {
View row=convertView;
if (row==null) {
LayoutInflater inflater=context. getLayoutInflater();
row=inflater.inflate(R.layout.row, null);
}
TextView label=(TextView)row.findViewById(R.id.label);
label.setText(items[position]);
ImageView icon=(ImageView)row.findViewById(R.id.icon);
if (items[position].length()>4) {
icon.setImageResource(R.drawable.delete);
}
else {
icon.setImageResource(R.drawable.ok);
}
return(row);
}
}
}
Si convertView est null, nous créons une ligne par inflation ; dans le cas contraire, nous
nous contentons de la réutiliser. Le code pour remplir les contenus (image de l’icône, texte
du label) est identique dans les deux cas. On évite ainsi une étape d’inflation potentiellement
coûteuse lorsque convertView n’est pas null.
Cependant, cette approche ne fonctionne pas toujours. Si, par exemple, une ListView
comprend des lignes ne contenant qu’une seule ligne de texte et d’autres en contenant
plusieurs, la réutilisation des lignes existantes devient problématique car les layouts
risquent d’être très différents. Si l’on doit créer une View pour une ligne qui compte deux
lignes de texte, par exemple, on ne peut pas se contenter de réutiliser une View avec une
seule ligne : il faut soit modifier les détails internes de cette View, soit l’ignorer et en créer
une nouvelle.
Il existe bien entendu des moyens de gérer ce type de problème, comme rendre la seconde
ligne de texte visible ou non en fonction des besoins, mais n’oubliez pas que chaque milliseconde d’utilisation du CPU d’un téléphone est précieuse – pour la fluidité de l’interface,
mais surtout pour la batterie.
Ceci étant dit, surtout si vous débutez avec Android, intéressez-vous d’abord à obtenir la
fonctionnalité que vous désirez et essayez ensuite d’optimiser les performances lors d’un
Livre Android.book Page 90 Dimanche, 8. novembre 2009 12:23 12
