Как отсортировать HashMap как добавленный в Android с ArrayAdapter - PullRequest
6 голосов
/ 30 января 2012

У меня есть 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);

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

Что не так?

Ответы [ 3 ]

6 голосов
/ 30 января 2012

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

2 голосов
/ 30 января 2012

Обновление: ответ от jitendra sharma является лучшим: Древовидная карта стоит намного больше, чем связанная хэш-карта и ничего не добавляет к вашему проекту, если вам нужно только сохранить исходный порядок вставки.

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

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

Удачи.

0 голосов
/ 30 января 2012

После сортировки списка вы должны либо вызвать adaptor.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();
...