09.02.2017 Views

creez-des-applications-pour-android

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

3.6 Des widgets plus avancés et <strong>des</strong> boîtes de dialogue<br />

Toutefois, dès qu’on fait défiler la liste jusqu’à afficher un élément qui n’était pas à l’écran à<br />

l’instant d’avant, convertView ne vaut plus null, mais plutôt la valeur de la vue qui vient<br />

de disparaître de l’écran. Ce qui se passe en interne, c’est que la vue qu’on n’affiche plus est<br />

recyclée, puisqu’on a plus besoin de la voir.<br />

Il nous faut alors un moyen d’inflater une vue, mais sans l’associer à notre activité. Il existe au<br />

moins trois métho<strong>des</strong> <strong>pour</strong> cela :<br />

— LayoutInflater getSystemService (LAYOUT_INFLATER_SERVICE) sur une activité.<br />

— LayoutInflater getLayoutInflater () sur une activité.<br />

— LayoutInflater LayoutInflater.from(Context contexte), sachant que Activity<br />

dérive de Context.<br />

Puis vous pouvez inflater une vue à partir de ce LayoutInflater à l’aide de la méthode View<br />

inflate (int id, ViewGroup root), avec root la racine à laquelle attacher la hiérarchie<br />

désérialisée. Si vous indiquez null, c’est la racine actuelle de la hiérarchie qui sera renvoyée,<br />

sinon la hiérarchie s’attachera à la racine indiquée.<br />

Pourquoi ce mécanisme me demanderez-vous ? C’est encore une histoire d’optimisation. En effet,<br />

si vous avez un layout personnalisé <strong>pour</strong> votre liste, à chaque appel de getView vous allez peupler<br />

votre rangée avec le layout à inflater depuis son fichier XML :<br />

LayoutInflater mInflater;<br />

String[] mListe;<br />

public View getView(int position, View convertView, ViewGroup parent) {<br />

TextView vue = (TextView) mInflater.inflate(R.layout.ligne, null);<br />

vue.setText(mListe[position]);<br />

}<br />

return vue;<br />

Cependant, je vous l’ai déjà dit plein de fois, la désérialisation est un processus lent ! C’est <strong>pour</strong>quoi<br />

il faut utiliser convertView <strong>pour</strong> vérifier si cette vue n’est pas déjà peuplée et ainsi ne pas<br />

désérialiser à chaque construction d’une vue :<br />

LayoutInflater mInflater;<br />

String[] mListe;<br />

public View getView(int position, View convertView, ViewGroup parent) {<br />

TextView vue = null ;<br />

// Si la vue est recyclée, elle contient déjà le bon layout<br />

if(convertView != null)<br />

// On n'a plus qu'à la récupérer<br />

vue = (TextView) convertView;<br />

else<br />

// Sinon, il faut en effet utiliser le LayoutInflater<br />

vue = mInflater.inflate(R.layout.ligne, null);<br />

vue.setText(mListe[position]);<br />

195

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!