我应该使用什么适配器在ListView中使用HashMap

时间:2011-03-08 15:32:43

标签: android

我想将HashMap用于Adapter的{​​{1}}项目列表。我打算使用ListView,但我不能,因为它只与ArrayAdapter<>一起使用。我应该使用什么适配器?

5 个答案:

答案 0 :(得分:56)

没有预定义的适配器可以呈现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:)

答案 1 :(得分:2)

您可以获取一系列地图条目:

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

话虽这么说,如果您计划更新地图或使用适配器中的地图功能,那么制作自定义适配器并不困难,并且会更有意义。

您可以通过继承BaseAdapter开始,它为您需要运行的所有适配器方法提供所有实现。

答案 2 :(得分: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);
}

答案 3 :(得分:0)

要维护字典中的顺序,如果键类型适用,您可以始终将它们添加到自己的ArrayList中,使用Collections.sort对其进行排序,并将其作为参考点使用。

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

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

答案 4 :(得分:0)

你能做什么,恕我直言,为你想要添加的Hashmap的键值生成一个新列表,然后将该列表传递给自定义适配器。然后在适配器中导入HashMap集合,并使用引用键列表中的HashMap.get(key);