Pages

dimanche 8 juillet 2012

Gérer les élements sous forme de liste dans une application Android (11/x)

Gérer une liste d’éléments est un besoin courant lorsque l’on construit une interface graphique. Android offre plusieurs composants pour afficher les données sous forme de liste (ListView) ou pour les sélectionner dans une liste déroulante (Spinner).

Nous allons voir trois manières de faire

Cas simple
Quand les données sont de type simple, vous pouvez lier ces composants avec des ressources de type Array définies par exemple dans le fichiers /res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="sports">
        <item >Basket</item>
        <item >Football</item>
        <item >Rugby</item>
    </string-array>
</resources>

Au niveau de la définition du layout vous pourrez lier la liste de cette manière
<Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/sports">
</Spinner>


Gérer le cas clé/valeur
Si votre structure de donnée correspond à un ensemble clé/valeur vous pouvez vous en sortir avec deux listes dans votre composant. La première destinée à l’affichage des valeurs et la seconde pour conserver les ids au niveau de votre classe

On ajoute une liste d’id dans le fichier de resources
<integer-array name="sports_id">
      <item >1</item>
      <item >2</item>
      <item >3</item>
</integer-array>


Dans l’activité vous pouvez retrouver au moment de la sélection d’un élément dans la liste le bon id en fonction de la position.
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    spinner = (Spinner)this.findViewById(R.id.spinner1);
    //Ajout Listener sur sélection dans la liste
    spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){
        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
                int pos, long id) {
            Toast.makeText(parent.getContext(),
                  "The sport is " + parent.getItemAtPosition(pos).toString() + " (id=" +
                  getResources().getIntArray(R.array.sports_id)[pos] + ")",
                  Toast.LENGTH_LONG).show();
        }
        @Override
        public void onNothingSelected(AdapterView<?> arg0) {

        }
    });
}


Solution plus élégante
Dans la pratique les exemples sont souvent plus compliqués et nous avons l’habitude de gérer des objets. L’association entre le composant Spinner et une liste de valeurs peut se faire comme nous l’avons fait plus haut mais également du côté de l’activité dans le code Java.

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.sports, android.R.layout.simple_spinner_item);
spinner.setAdapter(adapter);


Vous pouvez donc surcharger la classe android.widget.ArrayAdapter pour personnaliser le comportement et passer une liste d’objets à cet Adapter. Un exemple d’implémentation est disponible sur github https://github.com/javamind/FeuilleDeMatch/blob/master/src/com/ehret/scoresheet/adapter/SpinnerCustomAdapter.java

Au niveau de l’activité on aura le code suivant
List<MatchTypeEvent> events = getIntent().getExtras().getParcelableArrayList(PARAM_SPORT_EVENTS);
          
SpinnerCustomAdapter<MatchTypeEvent> adapter = new SpinnerCustomAdapter<MatchTypeEvent>(this, android.R.layout.simple_spinner_item, events);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

faitSpinner.setAdapter(adapter);


Tous les exemples appliqués ici sur les Spinner sont aussi valables sur les ListView. Un exemple est disponible à l’adresse suivante https://github.com/javamind/FeuilleDeMatch/blob/master/src/com/ehret/scoresheet/ScoreSheetActivity.java

Article précédent / Sommaire / Article suivant

1 commentaire:

  1. je veux afficher un menu de ressources ou l'on pouvait faire un choix de categorie dans mon appli

    RépondreSupprimer

Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.