2012-01-30 9 views
6

Tengo un HashMap<String,String> y hay un método estático que devuelve este mapa a Activity.Cómo ordenar HashMap como agregado en Android con ArrayAdapter

método es el siguiente:

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; 
} 

Quiero usar ese mapa con una ruleta. Así que la actividad se ve así:

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); 

Cuando traté de ejecutar mi aplicación, no hubo ningún problema. Pero cuando hice clic en spinner, los artículos no se ordenaron, ya que agregué el método getAll(). Quiero decir, el orden tiene que ser ab - bc --de pero está ordenado al azar.

¿Qué no es cierto?

Respuesta

6

en hashmap, el orden de inserción no se mantiene, por lo que el elemento insertado último se puede acceder primero. Si desea mantener el orden de inserción, utilice linkedhashmap en su lugar.

+0

Ahora ordena como añado, gracias. –

+0

O, simplemente use un TreeMap. Es lo que está ahí para que lo sepas. – Jens

+0

¡Acabas de ahorrarme mis horas! –

2

Actualización: Respuesta de jitendra sharma es la mejor: Un treemap cuesta mucho más que un mapa enlazado y no agrega nada a su proyecto si solo necesita mantener el orden de inserción original.

Hashmap no se puede ordenar. Eso es parte de su eficiencia.

Si necesita ordenar, utilice TreeMap.

Buena suerte.

+0

Un TreeMap no es especialmente ineficiente para un número normal de elementos, teniendo en cuenta el hecho de que aparentemente hay pocos elementos suficientes para usar un girador. – Jens

+0

Acabo de agregar la actualización para asegurarme de que el lector de futur sabe qué esperar y para las buenas prácticas. Del documento Oracle Java: "Esta implementación ahorra a sus clientes el pedido no especificado, generalmente caótico, proporcionado por HashMap (y Hashtable), sin incurrir en el mayor costo asociado con TreeMap": http://docs.oracle.com/javase/1.4 .2/docs/api/java/util/LinkedHashMap.html – Yahel

0

Debe llamar a adapter.notifyDataSetChanged() o spinTest.setAdapter (adaptador) después de haber ordenado su lista.

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(); 
Cuestiones relacionadas