2014-10-29 77 views
0

我想使用Map接口的實現之一,而不是實現ArrayList以將數據存儲在BaseAdapter中。我正在尋找通過索引從Map獲取值的最佳方法。當我有索引時從地圖創建列表似乎非常不高效。使用Map接口的實現而不是List接口將數據存儲在BaseAdapter中

@Override 
public Object getItem(int position) { 
// TODO Auto-generated method stub 
List<Map.Entry<String, String>> 
list = new LinkedList<Map.Entry<String,String>>(this.countries.entrySet()); 
return list.get(position); 
} 

任何建議如何以正確的方式做到這一點?

感謝advanace。

+0

爲什麼不使用更好的List 而不是地圖? – 2014-10-29 14:28:59

+0

我想通過密鑰在具有BaseAdapter實例的活動中保存對map的值的訪問。因此,我在BaseAdapter構造函數中傳遞了Map – ghost 2014-10-29 14:37:00

+0

但是... EntrySet是一個Set(無順序)。你不能期望在一個集合中建立的列表中的任何類型的訂單。 – 2014-10-29 14:39:29

回答

0

出於性能,你需要在你的適配器保持ArrayListMap值分別:

// Map<String, String> countries; 
ArrayList<String> countryList = new ArrayList<String>(countries.values()); 

您還需要每次更新列表地圖的變化,你要打電話notifyDataSetChanged()

這樣,你得到最佳的O(1)性能(因爲它應該是)你的getItem():

@Override 
public Object getItem(int position) { 
    return position < countryList.size() ? countryList(position) : null; 
} 

,不要忘記在getCount將()返回正確的值:

@Override 
public Object getCount() { 
    return countryList.size(); 
} 

注意,將有上(從地圖推出)列表的值是如何將責令沒有保證,所以你可能要對它們進行排序。

+0

我一直在努力如何解決地圖和列表之間的通信問題。以及如何爲列表提供添加到地圖中的相同元素。我發現地圖應該提供一個界面來通知新項目剛剛出現在地圖上。該接口將由BaseAdapter實現。 – ghost 2014-10-30 09:18:11