Android : Tri d’une ListView tout en gardant les ids

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.

Similar Posts:

    None Found