如何将Hashmap数据传递到Android中的BaseAdapter



我目前正在实现分段Listview适配器PinnedSectiked Listview

目前,我已经将实现更改为基本适配器,但在将值传递给基本适配器时遇到了一些问题

如何将Hashmap值传递给适配器。

示例-

HashMap<Integer, ArrayList<Test>> example = new HashMap<Integer, ArrayList<Test>>();

基本适配器实现

static class MyPinnedSectionListAdapter extends BaseAdapter implements PinnedSectionListView.PinnedSectionListAdapter{
    private ArrayList mList;
    private Context mContext;
    private LayoutInflater mInflater;
    ArrayList<Item> value;
    public static final int FIRST = 0;
    public static final int SECOND = 1;
    int size=0;
    private String[] mKeys;
    private Map<String, ArrayList<Item>> mData = new HashMap<String, ArrayList<Item>>();
    public MyPinnedSectionListAdapter(Context context, Map<String, ArrayList<Item>> map){
        mList=new ArrayList();
        mData=map;
        mKeys = mData.keySet().toArray(new String[mData.size()]);
        for (Map.Entry<String, ArrayList<Item>> entry : map.entrySet()) {
            value= entry.getValue();
            size+=value.size();
            System.out.println();
        }
        System.out.println("size" + size);
        mList.addAll(map.entrySet());
        this.mContext = context;
        this.mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public boolean isItemViewTypePinned(int viewType) {
        if(viewType == SECOND){
            return true;
        }else{
            return false;
        }
    }

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


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

    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        int viewType = getItemViewType(position);
        if(viewType == FIRST){
            convertView = mInflater.inflate(R.layout.item,parent,false);
            String key = mKeys[position];
            String Value = getItem(position).toString();
            ((TextView)convertView.findViewById(R.id.textView1)).setText(Value);
        }
        if(viewType == SECOND){
            String key = mKeys[position];
            String Value = getItem(position).toString();
            convertView = mInflater.inflate(R.layout.section,parent,false);
            ((TextView)convertView.findViewById(R.id.textView1)).setText(Value);
        }
        return convertView;
    }
    @Override
    public int getItemViewType(int position) {
        @SuppressWarnings("unchecked")
        ArrayList<Item> item = (ArrayList<Item>) getItem(position);
         if (item.get(position).type == 0){
             return FIRST;
         }else{
             return SECOND;
         }
    }
    @Override
    public int getViewTypeCount() {
        return 2;
    }
}

POJO:

static class Item {
        public static final int ITEM = 0;
        public static final int SECTION = 1;
        public final int type;
        public final String text;
        public int sectionPosition;
        public int listPosition;
        public Item(int type, String text) {
            this.type = type;
            this.text = text;
        }
        @Override public String toString() {
            return text;
        }
    }

代码:

HashMap>example=new HashMap>();

        ArrayList<Item> test1 = new ArrayList<Item>();
        test1.add( new Item(Item.SECTION, "Section1"));
        test1.add( new Item(Item.ITEM, "Section2"));
        test1.add( new Item(Item.ITEM, "Section3"));
        ArrayList<Item> test2 = new ArrayList<Item>();
        test2.add( new Item(Item.SECTION, "Section4"));
        test2.add( new Item(Item.ITEM, "Section5"));
        test2.add( new Item(Item.ITEM, "Section6"));
        example.put("1", test1);
        example.put("2", test2);
        setListAdapter(new MyPinnedSectionListAdapter(this,example));

我得到的是:

【第1节、【第2节】、【第3节】

[第4节]、[第5节]、【第6节】

为什么不使用HashMap<K,V>参数为MyPinnedSectionListAdapter创建构造函数。并将你的HashMap<Integer, ArrayList<Test>> example传递给它,

类似

public MyPinnedSectionListAdapter(Context context, HashMap<Integer, ArrayList<Test>> hashMap){...}

编辑:

根据@av_lee的评论。

你可以使用Guava的Multimap类具有等特性

  • 键包含在多映射中,当且仅当它映射到至少一个值。导致键为零的任何操作值具有从多映射中删除该键的效果
  • 条目总数可用size()表示

最新更新