2011-03-08 68 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);

相关问题