程序猿媛三:ExpandableListView二級菜單選擇

二級菜單展開選擇列表內容

聲明:博文爲原創,文章內容爲,效果展現,思路闡述,及代碼片斷。

    轉載請保留原文出處「http://my.oschina.net/gluoyer/blog」,謝謝!php

    您能夠到博客的「友情連接」中,「程序猿媛(最新下載)*.*」下載最新版本,持續更新!當前版本,也可直接點擊「當前1.2版本」下載。java

 

    本文介紹,利用ExpandableListView列表展現,並可選擇各個列表項。數組

    首先,看下實現效果:app

 b01 b02  b03

    下面,介紹實現關鍵步驟,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>());
	}
}

    若是須要是動態數據的話,在構造方法中,只進行成員變量的建立,不賦值。在須要的時候,經過方法調用進行動態添加便可,請根據實際使用狀況擴展,不贅述!

 

  • 組數據在getGroupView中的更新

其中,主要是佈局的加載,和數據的設置,代碼以下:

@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;
}

 

 

 

  • 二級列表在getChildView中的更新

    同組數據相似,主要也是佈局的加載,和數據的設置,限於版面,就不貼代碼了,請須要的猿媛下載查看源碼。

  • 點擊組項,列表展開事件的處理

    在這裏,我是在點擊某項展開的時候,將展開的項進行了收縮,處理以下:

@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版本」下載。

相關文章
相關標籤/搜索