ListView

Les listes views permettent d'afficher un ensemble de choses sous forme de liste que l'utilisateur pourra ensuite sélectionner.

Les éléments de la liste pouvant être de n'importe quel type.

 

Activité ListActivity vs Activity

Il existe une activité nommée ListActivity qui gère automatiquement une ListView. Pour utiliser cette activité, vous ne devez avoir qu'une seule list présente. Si vous en avez plusieurs, n'utilisez ListActivity !

Votre activité se présentera ainsi:

public class MainActivity extends ListActivity

Dans le cas de l'utilisation de ListActivity, la listView devra obligatoirement avoir l'id suivant dans le layout correspondant à votre activité:

android:id="@+id/android:list"

De plus, le listener est automatiquement intégré !

protected void onListItemClick(ListView parent, View v, int position, long id) { }

 

Dans le cas contraire, vous resterez sur Activity et vous aurez:

public class TestAdaptaterActivity extends Activity implements OnItemClickListener

La listView pourra avoir l'id que vous voulez (par exemple maList)

La méthode getListView() n'est plus utilisable. Il faudra utiliser la méthode (ListView)findViewById(android.R.id.maList);

 

Vous trouverez les deux exemples dans le chapitre sur les listeners: OnItemClickListener.

 

Définir les éléments de la liste

Pour définir l'ensemble des éléments de la liste, il faudra utiliser un adaptateur. La raison ? Et bien car nous n'avons pas à savoir comment seront construit les éléments de cette liste, laissons faire les spécialistes. Nous savons ce que nous voulons afficher, comment ils seront affichés ne nous intéresse pas !

L'adaptateur le plus simple étant ArrayAdapter, voici comment le définir:

Définir l'adaptateur comme suit:

// La liste des éléments que vous voulez afficher dans la votre ListView

String[] items = {"Element 1", "Element 2", "Element 3"};

// Puis création de l'adaptateur

ArrayAdapter<String> monAdaptater = new ArrayAdapter<String> (this, android.R.layout.simple_list_item_1, items);

android.R.layout.simple_list_item_1 est généré automatiquement lorsque vous posez votre ListView est indique le type de layout utilisé pour le textview qui affichera votre élément, sachant qu'il y aura 1 textview par éléments (d'où le item_1) . Pour une liste des android.R.layout, voir http://developer.android.com/reference/android/R.layout.html. Bon, ok, c'est un peu contradictoire avec ce que je disais précédemment: "nous n'avons pas à savoir comment ils seront affichés...", en fait un peu quand même !

Puis associer cet adaptateur à la liste view en utilsant la méthode setAdapter():

setAdapter(ListAdapter adapter);

 

Alimenter les éléments de la list view depuis strings.xml

Plus propre que la solution précédente, car facilite la maintenance et l'internationalisation.

<string-array name="fruits_array">

<item>Pomme</item>
<item>Poire</item>
<item>Fraise</item>
<item>Cerise</item>

</string-array>

String[] fruits = getResources().getStringArray(R.array.fruits_array);
setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, fruits));

 

Connaître le choix de l'utilisateur

Pour connaître la sélection de l'utilisateur, il faut poser un listener. Plus exactement un OnItemClickListener.

 

Définir le mode de sélection de l'utilisateur

Il sera possible de positionner un attribut mode de sélection avec la méthode setChoiceMode()

Les attributs sont les suivants:

ListView.CHOICE_MODE_NONE : Pas de choix (la méthode getCheckedItemCount() retourne 0). Mais le listener retournera quand même l'id de l'élément "sélectionné".

ListView.CHOICE_MODE_SINGLE : Choix d'un élément de la liste (la méthode getCheckedItemCount() retourne 1)

ListView.CHOICE_MODE_MULTIPLE : Plusieurs éléments de la liste sont sélectionnables (la méthode getCheckedItemCount() retourne n où n est le nombre d'éléments sélectionnés).

Image non trouvée !Pour ce dernier choix, utilisez android.R.layout.simple_list_item_checked à la place de android.R.layout.android.R.layout.simple_list_item_1 lors de la création de l'instance adaptater. Cela fera afficher des coches après chacuns des éléments de la liste pour indiquer ceux que l'utilisateur choisira.

 

Une autre option va permettre à l'utilisateur de saisir des lettres, et la liste view va alors sélectionner le premier élément dont les lettres du mot correspondent à la saisie.

setTextFilterEnabled(true);

 

Récupération du ou des items sélectionnés

Pour récupérer les items sélectionnés (Tous API)

for (int i=0; i<lv.getCount(); i++) {

if (lv.isItemChecked(i)) {

Log.d ("TestCheckedItem", "get item =" + lv.getItemAtPosition(i));

}

}

Pour récupérer les items sélectionnés (à partir de l'API 8):

Si votre ListView n'est pas en CHOICE_MODE_NONE, il est possible de récupérer la liste des items sélectionnés grâce à la méthode long [] idList=parent.getCheckedItemIds();

Cependant, cette méthode ne peut marcher que si l'adaptateur considère comme fiable les ids de ces items. Il faudra donc tester monAdaptater.hasStableIds(). Si vrai, alors tout est ok, la méthode est utilisable, sinon, impossible de s'en servir !