轉載請保留原文出處「http://my.oschina.net/gluoyer/blog」,謝謝!php
您能夠到博客的「友情連接」中,「程序猿媛(最新下載)*.*」下載最新版本,持續更新!當前版本,也可直接點擊「當前1.2版本」下載。java
本文介紹,利用ExpandableListView列表展現,並可選擇各個列表項。數組
首先,看下實現效果:app
下面,介紹實現關鍵步驟,ide
代碼裏主要自定義了ExpListAdapter,繼承自BaseExpandableListAdapter。裏面會須要重寫一些方法。須要重寫的方法不少,其關鍵:佈局
是構造方法中數據的建立;ui
組項在getGroupView中的更新;this
二級列表在getChildView中的更新。.net
另外,能夠關注的方法有:3d
點擊組項,列表展開事件的處理;
以及,子列表項點擊事件的設置。
下面,依次介紹:
由於只是思路的闡述,這裏使用了固定數據作演示:
// 在array.xml中定義了子列表的數組 private int[] childResIds = new int[] { R.array.array_explist_child_wei_name, R.array.array_explist_child_shu_name, R.array.array_explist_child_wu_name }; // 存儲組數據 private ArrayList<SelectChildData> list; // 記錄選擇的子項 private HashMap<Integer, HashSet<Integer>> mSelectIds; @SuppressLint("UseSparseArrays") public ExpListAdapter() { mSelectIds = new HashMap<Integer, HashSet<Integer>>(); list = new ArrayList<SelectChildData>(); String[] parent = getResources().getStringArray(R.array.array_explist_title_name); getResources().getStringArray(R.array.array_explist_child_wei_name); for(int i=0, size=parent.length; i<size; i++) { SelectChildData p = new SelectChildData(); String[] child = getResources().getStringArray(childResIds[i]); ArrayList<SelectChildData> cl = new ArrayList<SelectChildData>(); for(int j=0, len=child.length; j<len; j++) { SelectChildData c = new SelectChildData(); c.id = j; c.name = child[j]; cl.add(c); } p.id = i; p.name = parent[i]; p.children = cl; list.add(p); mSelectIds.put(i, new HashSet<Integer>()); } }
若是須要是動態數據的話,在構造方法中,只進行成員變量的建立,不賦值。在須要的時候,經過方法調用進行動態添加便可,請根據實際使用狀況擴展,不贅述!
其中,主要是佈局的加載,和數據的設置,代碼以下:
@Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { // 加載組佈局,獲取內容 GroupViewHolder holder; if(null == convertView) { convertView = View.inflate(ExpListSelectActivity.this, R.layout.explist_group_item, null); holder = new GroupViewHolder(); holder.mTitle = (TextView) convertView.findViewById(R.id.explist_group_title); holder.mSelNum = (TextView) convertView.findViewById(R.id.explist_group_selected_num); holder.mIndicator = (ImageView) convertView.findViewById(R.id.explist_group_indicator); convertView.setTag(holder); } else { holder = (GroupViewHolder) convertView.getTag(); } // 獲取數據 SelectChildData data = (SelectChildData) getGroup(groupPosition); // 標題設置 holder.mTitle.setText(data.name); // 當前選擇內容數量,和總數,顯示如:(1/10) ArrayList<SelectChildData>list = data.children; int cnt = 0, num = 0; if(null != list && !list.isEmpty()) { HashSet<Integer> cids = mSelectIds.get(groupPosition); for(SelectChildData d : list) { if(cids.contains(d.id)) { num ++; } } cnt = list.size(); } holder.mSelNum.setText( String.format(getResources().getString(R.string.str_trans_receiver_num), num, cnt)); // 設置右側顯示圖標 if(isExpanded) { holder.mIndicator.setImageResource(R.drawable.icon_sub); convertView.setSelected(true); } else { holder.mIndicator.setImageResource(R.drawable.icon_add); convertView.setSelected(false); } return convertView; }
同組數據相似,主要也是佈局的加載,和數據的設置,限於版面,就不貼代碼了,請須要的猿媛下載查看源碼。
在這裏,我是在點擊某項展開的時候,將展開的項進行了收縮,處理以下:
@Override public void onGroupExpanded(int groupPosition) { // mExpListView 是列表實例,經過判斷它的狀態,關閉已經展開的。 for(int i=0, cnt=getGroupCount(); i<cnt; i++) { if(groupPosition != i && mExpListView.isGroupExpanded(i)) { mExpListView.collapseGroup(i); } } super.onGroupExpanded(groupPosition); }
代碼中,定義了子列表項點擊監聽,在裏面更新選擇子項的內容記錄。
// 定義監聽事件,子列表項點擊後,調用Adapter的方法進行更新 private OnChildClickListener mOnChildClickListener = new OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { mExpListAdapter.onChildClick(groupPosition, childPosition); return true; } }; // Adapter中的子列表項點擊處理方法 // 根據列表自身特性,經過從0開始的位置,做爲key進行記錄 public void onChildClick(int groupPosition, int childPosition) { HashSet<Integer> children = mSelectIds.get(groupPosition); if(children.contains(childPosition)) { children.remove(childPosition); } else { children.add(childPosition); } notifyDataSetChanged(); }
最後,能夠在文初的截圖中看到,點擊「肯定」按鈕,經過Toast顯示了選擇的內容,獲取內容的方法在ExpListAdapter中定義,主要是對記錄的內容進行了拼接,以下:
public String getSelectInfo() { StringBuilder s = new StringBuilder(); for(int i=0, size=mSelectIds.size(); i<size; i++) { HashSet<Integer> children = mSelectIds.get(i); // 記錄不爲空,則遍歷列表去查找。 if(!children.isEmpty()) { s.append(list.get(i).name); s.append(": "); ArrayList<SelectChildData> cl = list.get(i).children; for(int j=0, len=cl.size(); j<len; j++) { if(children.contains(cl.get(j).id)) { s.append(cl.get(j).name); s.append(" "); } } s.append("\n"); } } if(s.length() > 0) { return s.toString(); } else { return "No Selection"; } }
Ok,基本點就這些了,應用安裝後的源碼獲取,及獲取後文件結構的狀況,能夠參考「程序猿媛」系列博文的第一篇:Android滑動翻頁+區域點擊事件
轉載請保留原文地址「http://my.oschina.net/gluoyer/blog/176925」,謝謝!
您能夠到博客的「友情連接」中,「程序猿媛(最新下載)*.*」下載最新版本,持續更新!當前版本,也可直接點擊「當前1.2版本」下載。