2012-01-30 37 views
6

我有一個HashMap<String,String>,並且有一個靜態方法將此映射返回到Activity如何使用ArrayAdapter對Android中添加的HashMap進行排序

方法是這樣的:

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,但它是隨機排列的。

什麼是不正確的?

回答

6

在散列圖中,插入順序不被維護,所以最後插入的項可能首先被訪問。如果要維護插入順序,請改爲使用linkedhashmap。

+0

現在,我添加的訂單,謝謝。 – 2012-01-30 09:30:16

+0

或者,只需使用TreeMap。這就是你知道的。 – Jens 2012-01-30 12:12:21

+0

你剛剛救了我的小時! – 2015-01-19 04:36:05

2

更新:通過回答jitendra sharma是最好的: 如果您只需要保持原始插入順序,樹圖的成本比鏈接的陰影圖要多得多,並且不會爲您的項目添加任何內容。

散列圖無法排序。這是他們效率的一部分。

如果您需要排序,請使用TreeMap

祝你好運。

+0

對於正常數量的項目,TreeMap不是特別低效 - 考慮到顯然只有很少的項目可以使用微調器。 – Jens 2012-01-30 12:14:16

+0

我剛剛添加了更新,以確保未來的讀者知道什麼期望和良好的做法。從Oracle Java文檔:「該實現將客戶端從HashMap(和Hashtable)提供的未指定的,通常混亂的排序中排除,而不會增加與TreeMap相關的成本增加」:http://docs.oracle.com/javase/1.4 0.2 /文檔/ API/JAVA/UTIL/LinkedHashMap.html – Yahel 2012-01-30 13:01:25

0

在對列表排序後,您應該調用adapter.notifyDataSetChanged()或spinTest.setAdapter(adapter)。

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(); 
相關問題