2012-01-30 9 views
6

Ho un HashMap<String,String> e c'è un metodo statico che restituisce questa mappa a Activity.Come ordinare HashMap come aggiunto in Android con ArrayAdapter

metodo è simile al seguente:

public static HashMap<String, String> getAll() {  
    HashMap<String, String> map = new HashMap<String,String>(); 

    map.put("ab", "value1"); 
    map.put("bc", "value2"); 
    map.put("de", "value3"); 

    return map; 
} 

voglio usare quella mappa con un filatore. Quindi, l'attività si presenta così:

List list = new ArrayList<String>(); 
HashMap<String, String> map = Constants.getAll(); 

for (String key : map.keySet()) { 
    list.add(Constants.getAll().get(key).toString()); 
} 

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list); 
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

spinTest = (Spinner)findViewById(R.id.spinTest); 

spinTest.setOnItemSelectedListener(new OnItemSelectedListener() { 
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     urlDebug.setText(list.get(arg2).toString()); 
    } 

    public void onNothingSelected(AdapterView<?> arg0) { 

    } 
}); 

spinTest.setAdapter(adapter); 

Quando ho provato a correre la mia domanda, nessun problema a tutti. Ma quando ho cliccato su spinner, elementi non ordinati come ho aggiunto sul metodo getAll(). Voglio dire, l'ordine deve essere ab-bc -de ma è ordinato a caso.

Che cosa non è vero?

risposta

6

in hashmap, l'ordine di inserimento non viene mantenuto, quindi l'elemento inserito per ultimo può accedere prima. Se si desidera mantenere l'ordine di inserimento, utilizzare invece linkedhashmap.

+0

Ora ordini come aggiungo, grazie. –

+0

Oppure, usa solo una TreeMap. È quello che è lì per te lo sai. – Jens

+0

Hai appena salvato le mie ore! –

2

Aggiornamento: Risposta da jitendra sharma è la migliore: Una treemap costa molto di più di una mappahashlink e non aggiunge nulla al progetto se è necessario solo mantenere l'ordine di inserimento originale.

Hashmap non può essere ordinato. Fa parte della loro efficienza.

Se è necessario l'ordinamento, utilizzare TreeMap.

Buona fortuna.

+0

Una TreeMap non è particolarmente inefficiente per un numero normale di elementi, considerando il fatto che apparentemente pochi elementi sono sufficienti per utilizzare uno spinner. – Jens

+0

Ho appena aggiunto l'aggiornamento per assicurarmi che il lettore di futur sappia cosa aspettarsi e per le buone pratiche. Da Oracle Java doc: "Questa implementazione risparmia i propri clienti dall'ordinamento non specificato, generalmente caotico fornito da HashMap (e da Hashtable), senza incorrere nell'aumento del costo associato a TreeMap": http://docs.oracle.com/javase/1.4 .2/docs/api/java/util/LinkedHashMap.html – Yahel

0

È necessario chiamare adapter.notifyDataSetChanged() o spinTest.setAdapter (adattatore) dopo aver ordinato l'elenco.

spinTest.setOnItemSelectedListener(new OnItemSelectedListener() { 
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     urlDebug.setText(list.get(arg2).toString()); 
    } 

    public void onNothingSelected(AdapterView<?> arg0) { 

    } 
}); 

spinTest.setAdapter(adapter); 
// TODO: Sort the list 
// Some code here 
adapter.notifyDataSetChanged(); 
Problemi correlati