如何在Android中将Hashmap数据传递给BaseAdapter

时间:2014-10-29 20:20:05

标签: android listview android-listview

我目前正在实施Sectioned Listview Adapter PinnedSectioned 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;
        }

    }

CODE:

的HashMap&GT; example = new HashMap&gt;();

        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节]

1 个答案:

答案 0 :(得分:2)

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

类似的东西,

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

修改

根据@av_lee的评论。

您可以使用Guava's Multimap class 具有像

这样的属性
  • 当且仅当映射到至少时,密钥才包含在多图中 一个价值。任何导致键关联为零的操作 values具有从multimap中删除该键的效果。
  • 总条目数可用作尺寸()。