Durant le développement du projet b-box j’ai rencontré un problème avec mon menu. Ce menu est présent sous forme de ListActivity (comprenant une ListView), était trié selon un ordre alphabétique qui est susceptible de changer puisque l’application peut-être traduite.
Au début, j’ai essayé diverses méthodes, mais les id de position étant perdus… pas moyen de savoir à quoi correspond quoi.
J’ai donc du trouver une solution, solution que je vous présente.
But
Le but est de créer un menu sous forme de liste (ListView) dont chaque élément est cliquable et permet de récupérer l’id du clic. Cet id servant à lancer une autre Activity, par exemple.
Exemple
Tout d’abord la classe Menu :
package org.android.bbox; import java.util.Comparator; public class Menu { private int id; private String label; public Menu(int id, String label) { this.id = id; this.label = label; } public String getLabel() { return this.label; } public int getId() { return this.id; } public static Menu[] factory(String[] menus) { Menu[] menu = new Menu[menus.length]; for(int i = 0; i < menus.length; i++) { menu[ i ] = new Menu(i, menus[ i ]); } return menu; } public static Comparator getComparator() { return new Comparator(){ @Override public int compare(Menu m1, Menu m2) { return m1.getLabel().compareTo(m2.getLabel()); } }; } public String toString() { return this.getLabel(); } } |
Et la classe de l’activité :
// ... public void onCreate(Bundle savedInstanceState) { //... Menu[] m = Menu.factory(getResources().getStringArray(R.array.main_list_array));//récupération d'un tableau de string et création d'un tableau de Menu ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, m);//création de l'adaptateur permettant l'affichage adapter.sort(Menu.getComparator());//tri du menu ListView myList = (ListView) findViewById(android.R.id.list); myList.setAdapter(adapter);//ajotu du menu à la ListView myList.setOnItemClickListener(this); //... } @Override public void onItemClick(AdapterView parent, View view, int position, long id) { System.out.print(position); System.out.print(" | "); System.out.print(parent.getItemAtPosition(position)); System.out.print(" | "); System.out.print(parent.getItemAtPosition(position).getClass()); System.out.print(" | "); System.out.print(((Menu)parent.getItemAtPosition(position)).getId()); System.out.print(" | "); System.out.println(id); //... } // ... |
Remarque : la méthode toString permet l’affichage de l’élément dans la liste.