Как сортировать HashMap, добавленный в Android с помощью ArrayAdapter

у меня есть HashMap<String,String> и есть статический метод, который возвращает эту карту к Activity.

метод выглядит так:

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

Я хочу использовать эту карту с блесны. Поэтому активность выглядит так:

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

когда я попытался запустить свое приложение, никаких проблем. Но когда я нажал на spinner, элементы не были упорядочены, поскольку я добавил метод getAll (). Я имею в виду, заказ должен быть ab - bc-de, но он упорядочен случайным образом.

что не правда?

3 ответов


в hashmap порядок вставки не поддерживается, поэтому элемент, вставленный последним, может получить доступ первым. Если вы хотите сохранить порядок вставки, используйте linkedhashmap вместо этого.


Update: ответ джитендры шармы-лучший : Treemap стоит намного больше, чем linkedhashmap и ничего не добавляет к вашему проекту, если вам нужно только сохранить исходный порядок вставки.

Hashmap не может быть отсортирован. Это часть их эффективности.

Если вам нужна сортировка, используйте TreeMap.

удачи.


вы должны либо вызвать адаптер.notifyDataSetChanged () или spinTest.setAdapter(адаптер) после сортировки списка.

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