Widgets de sélection
S’adapter aux circonstances
Dans l’absolu, les adaptateurs offrent une interface commune pour différentes API. Plus précisément, dans le cas d’Android, ils fournissent une interface commune au modèle de données sous-jacent d’un widget de sélection comme une liste déroulante. Cette utilisation des interfaces Java est assez classique (voir, par exemple, les adaptateurs de modèles pour JTable en Java/Swing), et Java n’est pas le seul environnement à fournir ce type d’abstraction (le framework XML de Flex accepte indifféremment du code XML en ligne ou téléchargé à partir d’Internet). Les adaptateurs d’Android se chargent de fournir la liste des données d’un widget de sélection et de convertir les différents éléments en vues spécifiques pour qu’elles s’affichent dans ce widget de sélection. Ce dernier aspect des adaptateurs peut sembler un peu curieux mais, en réalité, il n’est pas si différent de ce que proposent les autres kits de développement graphiques pour redéfinir l’affichage par défaut. En Java/Swing, par exemple, si vous souhaitez qu’une liste implémentée par une JList soit, en réalité, une liste à cocher (où les différentes lignes sont composées d’une case à cocher et d’un label et où les clics modifient l’état de cette liste), vous finirez inévitablement par appeler la méthode setCellRenderer() pour disposer d’un objet ListCellRenderer qui, à son tour, permet de convertir le contenu d’une liste en widgets composites JCheckBox-plus-JLabel.
Utilisation d’ArrayAdapter
L’adaptateur le plus simple est ArrayAdapter puisqu’il suffit d’envelopper un tableau ou une instance de java.util.List pour disposer d’un adaptateur prêt à fonctionner : String[] items = {« ceci », « est », « une », « liste », « vraiment », « stupide »}; new ArrayAdapter(this, android.R.layout.simple_list_item_1, items); Le constructeur d’ArrayAdapter attend trois paramètres : ● le contexte d’utilisation (généralement, il s’agit de l’instance de l’activité) ; ● l’identifiant de ressource de la vue à utiliser ; ● le tableau ou la liste d’éléments à afficher. Par défaut, ArrayAdapter appellera la méthode toString() des objets de la liste et enveloppera chaque chaîne ainsi obtenue dans la vue désignée par la ressource indiquée. android.R.layout.simple_list_item_1 se contente de transformer ces chaînes en objets TextView qui, à leur tour, s’afficheront dans la liste, le spinner ou tout widget qui utilise cet ArrayAdapter. Vous pouvez confectionner vos propres vues en créant une sousclasse d’ArrayAdapter pour redéfinir sa méthodegetView() : public View getView(int position, View convertView, ViewGroup parent) { if (convertView==null) { convertView=new TextView(this); } convertView.setText(buildStringFor(position)); return(convertView); } Ici, getView() reçoit trois paramètres : ● L’indice de l’élément du tableau que l’on veut afficher dans la vue. ● Une vue existante qui sera modifiée avec les données à cette position (si ce paramètre vaut null, vous devrez créer votre propre instance). ● Le widget qui contiendra cette vue, s’il faut l’instancier. Dans l’exemple précédent, l’adaptateur renvoie quand même un objet TextView mais utilise un comportement différent pour savoir quelle chaîne sera placée dans la vue. Le Chapitre 9 présentera des ListView plus élaborées.
Listes des bons et des méchants
Le widget classique d’Android pour les listes s’appelle ListView. Pour disposer d’une liste complètement fonctionnelle, il suffit d’inclure un objet ListView dans votre présentation, d’appeler setAdapter() pour fournir les données et les vues filles, puis d’attacher un écouteur via setOnItemSelectedListener() pour être prévenu de toute modification de la sélection. Cependant, si votre activité est pilotée par une seule liste, il peut être préférable que cette activité soit une sous-classe de ListActivity plutôt que de la classe de base Activity traditionnelle. Si votre vue principale est uniquement constituée de la liste, vous n’avez même pas besoin de fournir de layout – ListActivity construira pour vous une liste qui occupera tout l’écran. Vous pouvez toutefois personnaliser cette présentation à condition d’identifier cette ListView par @android:id/list, afin que ListActivity sache quelle est la liste principale de l’activité. Voici, par exemple, le fichier de disposition du projet Selection/List : Comme vous pouvez le constater, il s’agit simplement d’une liste surmontée d’un label qui devra afficher en permanence la sélection courante. Le code Java permettant de configurer cette liste et de la connecter au label est le suivant : public class ListViewDemo extends ListActivity { TextView selection; String[] items={« lorem », « ipsum », « dolor », « sit », « amet », « consectetuer », « adipiscing », « elit », « morbi », « vel », « ligula », « vitae », « arcu », « aliquet », « mollis », « etiam », « vel », « erat », « placerat », « ante », « porttitor », « sodales », « pellentesque », « augue », « purus »}; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, items)); selection=(TextView)findViewById(R.id.selection); } public void onListItemClick(ListView parent, View v, int position, long id) { selection.setText(items[position]); } }