2011-03-08 69 views

回答

2

你可以得到你的地圖項的數組:

Entry<MyKey, MyValue>[] entries = 
    map.entrySet().toArray(new Entry<MyKey, MyValue>[0]); 

話雖這麼說,如果你在更新地圖或使用地圖功能的適配器,然後進行自定義適配器規劃並不困難,並會更有意義。

您可以通過子類BaseAdapter開始,它提供了所有需要運行的幾個Adapter方法的實現。

+1

你如何處理'不能創建一個通用數組 Map.Entry '異常? – 2012-02-02 09:23:19

50

沒有預定義的適配器將呈現HashMap。我建議通過擴展BaseAdapter來創建自己的適配器。

編輯:這是更多鈔票與使用HashMap和擴大BaseAdapter,這裏是一個(未經測試)例如:

public class HashMapAdapter extends BaseAdapter { 

    private HashMap<String, String> mData = new HashMap<String, String>(); 
    private String[] mKeys; 
    public HashMapAdapter(HashMap<String, String> data){ 
     mData = data; 
     mKeys = mData.keySet().toArray(new String[data.size()]); 
    } 

    @Override 
    public int getCount() { 
     return mData.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mData.get(mKeys[position]); 
    } 

    @Override 
    public long getItemId(int arg0) { 
     return arg0; 
    } 

    @Override 
    public View getView(int pos, View convertView, ViewGroup parent) { 
     String key = mKeys[pos]; 
     String Value = getItem(pos).toString(); 

     //do your view stuff here 

     return convertView; 
    } 
} 

這具有以下警告,該項目的順序是不能保證是相同的爲了添加它們。寫這個例子讓我意識到了;不要在一個適配器使用HashMap的:)

+0

您無法使用HashMap是您的擴展BaseAdapter類,因爲BaseAdapter實現了ListAdapter。 – Eugene 2011-03-08 19:40:33

+2

上面添加的例子 – longhairedsi 2011-03-08 23:04:52

+0

如果有人仍在尋找解決方案,我建議檢查我對類似問題的答案:http:// stackoverflow。com/a/19467717/1891118 – 2014-02-21 15:15:49

16

感謝您的回答longhairedsi

這具有以下警告,該項目的順序是不能保證你加入他們的順序相同。寫這個例子讓我意識到了;不要在適配器中使用HashMap :)

要解決此問題,請改爲使用LinkedHashMap。

public class HashMapAdapter extends BaseAdapter { 
    private LinkedHashMap<String, String> mData = new LinkedHashMap<String, String>(); 
    private String[] mKeys; 
    public HashMapAdapter(LinkedHashMap<String, String> data){ 
     mData = data; 
     mKeys = mData.keySet().toArray(new String[data.size()]); 
    } 

    @Override 
    public int getCount() { 
     return mData.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mData.get(mKeys[position]); 
    } 

    @Override 
    public long getItemId(int arg0) { 
     return arg0; 
    } 

    @Override 
    public View getView(int pos, View convertView, ViewGroup parent) { 
     String key = mKeys[pos]; 
     String Value = getItem(pos).toString(); 

     //do your view stuff here 

     return convertView; 
    } 
} 
+2

我有同樣的問題。我現在使用List >而不是HashMap Klaasvaak 2012-05-16 08:55:45

+2

您可以通過使用TreeMap來克服此限制。 – Skynet 2013-08-31 11:41:39

0

在適配器文件

MyAdapter.java

import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.BaseAdapter; 
    import android.widget.TextView; 

    import java.util.ArrayList; 
    import java.util.Map; 

    public class MyAdapter extends BaseAdapter { 
     private final ArrayList mData; 

     public MyAdapter(Map<String, String> map) { 
      mData = new ArrayList(); 
      mData.addAll(map.entrySet()); 
     } 

     @Override 
     public int getCount() { 
      return mData.size(); 
     } 

     @Override 
     public Map.Entry<String, String> getItem(int position) { 
      return (Map.Entry) mData.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      // TODO implement you own logic with ID 
      return 0; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      final View result; 

      if (convertView == null) { 
       result = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_adapter_item, parent, false); 
      } else { 
       result = convertView; 
      } 

      Map.Entry<String, String> item = getItem(position); 

      // TODO replace findViewById by ViewHolder 
      ((TextView) result.findViewById(R.id.text1)).setText(item.getKey()); 
      ((TextView) result.findViewById(R.id.text2)).setText(item.getValue()); 

      return result; 
     } 
    } 

調用此適配器

public void showCinemas(HashMap<String, String> cinemas) { 
    MyAdapter adapter = new MyAdapter(cinemas); 
    list.setAdapter(adapter); 
} 
0

詞典中維持秩序,如果密鑰類型適用,你總是可以將它們添加到它們自己的ArrayList中,進行排序它使用Collections.sort,並將其作爲參考點。

private ArrayList<String> mKeys = new ArrayList<>(); 

for (String aKey :data.keySet()){ 
     mKeys.add(aKey); 
    } 
Collections.sort(mKeys); 
0

你能做什麼,恕我直言,是生成您嘗試添加HashMap中的他們鍵值一個新的列表,然後將該列表傳遞到自定義適配器。然後將HashMap集合導入到適配器中,並使用參考鍵列表中的HashMap.get(key);

相關問題