先上效果图:
(效果图中的数据皆来自Map)
扯点犊子:
其实Android对Java基础的要求并不高,虽然Android是基于Java的,但是Android有更多它自己的东西。
但是对于Java基础还是需要充分的了解,这会对你的开发事半功倍,就像英语不好的开发者一样可以看懂代码,但是英语好的开发者效率一定比英语不好的高。
一、Map
Map是以键值对的方式进行数据读写且无序,底层是通过key的hashCode计算hash值,根据hash值得到位置索引, 然后对该位置索引进行读写。
HashMap
HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。
HashMap底层就是一个数组结构,数组中的每一项又是一个链表。
二、实战
1.数据源
//添加数据 map1 = new HashMap<>(); map1.put(100, 10); map1.put(300, 30); map1.put(200, 20); map1.put(400, 40); ArrayList<String> list = new ArrayList<>(); for (int i = 0; i < 2; i++) { list.add(" ParseMap " + i); } map2 = new HashMap<>(); map2.put(100, list); map2.put(200, list); map2.put(300, list);
2.遍历并排序
a)效果图一。
//把key转为一个集合 List<Integer> list = new ArrayList<>(map1.keySet()); //比较器 Collections.sort(list, new Comparator<Integer>() { @Override public int compare(Integer s1, Integer s2) { //升序排列 ,降序 把s1 s2调换即可 return s1.compareTo(s2); } }); //遍历得到key和value,添加到集合 keyList = new ArrayList<>(); valueList = new ArrayList<>(); //遍历map的常用方法一 for (Integer i : list) { Log.i("常用方法一", "key = " + i + " , value = " + map1.get(i)); keyList.add(i); valueList.add(map1.get(i)); }
b)效果图二。
第二种方法没有排序,效果图二中是300、200、100,而数据源添加的顺序是100、200、300,但是显示的效果却是相反的,这是因为Entry是从前向后添加的,也就是最后添加的数据在数组的最前面。
//遍历得到key和value,添加到集合 keyList = new ArrayList<>(); valueList = new ArrayList<>(); //遍历map的常用方法二 for (Map.Entry<Integer, List<String>> entry : map2.entrySet()) { Log.i("常用方法二", "key = " + entry.getKey() + " , value = " + entry.getValue()); keyList.add(entry.getKey()); valueList.add(entry.getValue()); }
三、代码
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.yechaoa.parsemap.MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/button1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="解析map并排序" /> <Button android:id="@+id/button2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="解析嵌套map" /> </LinearLayout> <GridView android:id="@+id/gridView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:columnWidth="90dp" android:horizontalSpacing="10dp" android:numColumns="2" android:scrollbars="none" android:stretchMode="columnWidth" android:verticalSpacing="10dp" android:visibility="gone" /> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="10dp" android:visibility="gone" /> </LinearLayout>
MainActivity.java
package com.yechaoa.parsemap; import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.GridView; import android.widget.ListView; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button button1; private Button button2; private GridView gridView; private ListView listView; private HashMap<Integer, Integer> map1; private HashMap<Integer, List<String>> map2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); initListener(); } private void initView() { button1 = (Button) findViewById(R.id.button1); button2 = (Button) findViewById(R.id.button2); gridView = (GridView) findViewById(R.id.gridView); listView = (ListView) findViewById(R.id.listView); } private void initData() { //添加数据 map1 = new HashMap<>(); map1.put(100, 10); map1.put(300, 30); map1.put(200, 20); map1.put(400, 40); ArrayList<String> list = new ArrayList<>(); for (int i = 0; i < 2; i++) { list.add(" ParseMap " + i); } map2 = new HashMap<>(); map2.put(100, list); map2.put(200, list); map2.put(300, list); } private void initListener() { button1.setOnClickListener(this); button2.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { //为演示效果直接控制样式 case R.id.button1: button2.setTextColor(Color.BLACK); button1.setTextColor(Color.RED); listView.setVisibility(View.GONE); gridView.setVisibility(View.VISIBLE); gridView.setAdapter(new GridViewAdapter(this, map1)); break; case R.id.button2: button1.setTextColor(Color.BLACK); button2.setTextColor(Color.RED); gridView.setVisibility(View.GONE); listView.setVisibility(View.VISIBLE); listView.setAdapter(new ListViewAdapter(this, map2)); break; } } }
GridViewAdapter.java
package com.yechaoa.parsemap; import android.content.Context; import android.util.Log; 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.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; /** * Created by yechao on 2017/4/21. * Describe : */ public class GridViewAdapter extends BaseAdapter { private Context mContext; private Map<Integer, Integer> map1; private final List<Integer> keyList; private final List<Integer> valueList; public GridViewAdapter(Context mContext, Map<Integer, Integer> map1) { super(); this.mContext = mContext; this.map1 = map1; //把key转为一个集合 List<Integer> list = new ArrayList<>(map1.keySet()); //比较器 Collections.sort(list, new Comparator<Integer>() { @Override public int compare(Integer s1, Integer s2) { //升序排列 ,降序 把s1 s2调换即可 return s1.compareTo(s2); } }); //遍历得到key和value,添加到集合 keyList = new ArrayList<>(); valueList = new ArrayList<>(); //遍历map的常用方法一 for (Integer i : list) { Log.i("常用方法一", "key = " + i + " , value = " + map1.get(i)); keyList.add(i); valueList.add(map1.get(i)); } } @Override public int getCount() { return map1.size(); } @Override public Object getItem(int position) { return map1.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(this.mContext).inflate(R.layout.item_gridview, parent, false); holder = new ViewHolder(); holder.item_gv_textView1 = (TextView) convertView.findViewById(R.id.item_gv_textView1); holder.item_gv_textView2 = (TextView) convertView.findViewById(R.id.item_gv_textView2); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.item_gv_textView1.setText(String.valueOf("充¥" + keyList.get(position))); holder.item_gv_textView2.setText(String.valueOf("送¥" + valueList.get(position))); return convertView; } private class ViewHolder { TextView item_gv_textView1; TextView item_gv_textView2; } }
ListViewAdapter.java
package com.yechaoa.parsemap; import android.content.Context; import android.util.Log; 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.HashMap; import java.util.List; import java.util.Map; /** * Created by yechao on 2017/4/21. * Describe : */ public class ListViewAdapter extends BaseAdapter { private Context mContext; private HashMap<Integer, List<String>> map2; private List<Integer> keyList; private List<List<String>> valueList; public ListViewAdapter(Context mContext, HashMap<Integer, List<String>> map2) { super(); this.mContext = mContext; this.map2 = map2; //遍历得到key和value,添加到集合 keyList = new ArrayList<>(); valueList = new ArrayList<>(); //遍历map的常用方法二 for (Map.Entry<Integer, List<String>> entry : map2.entrySet()) { Log.i("常用方法二", "key = " + entry.getKey() + " , value = " + entry.getValue()); keyList.add(entry.getKey()); valueList.add(entry.getValue()); } } @Override public int getCount() { return map2.size(); } @Override public Object getItem(int position) { return map2.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(this.mContext).inflate(R.layout.item_listview, parent, false); holder = new ViewHolder(); holder.itemLvTitle = (TextView) convertView.findViewById(R.id.item_lv_title); holder.itemLvListView = (MyListView) convertView.findViewById(R.id.item_lv_listView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.itemLvTitle.setText(String.valueOf(keyList.get(position))); //再把value集合传给嵌套的ListViewSubAdapter holder.itemLvListView.setAdapter(new ListViewSubAdapter(mContext, valueList.get(position))); return convertView; } private class ViewHolder { TextView itemLvTitle; MyListView itemLvListView; } }