您的位置:首页 > 移动开发 > Android开发

android下ExpandableListView的详细使用demo

2013-03-22 11:26 543 查看
一直认为ExpandableListView是比较好的一个东西,虽然不常用,但是上次网上查资料看到了这个demo,研究了一下,标记一下,以后使用的时候来看看。

效果图如下:



ExpandableListViewActivity

package com.yhx.expandablelistview;

import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ExpandableListView;
import android.widget.Toast;
import android.widget.ExpandableListView.OnChildClickListener;

//主activity
public class ExpandableListViewActivity extends Activity {

	ExpandableListView expandableListView;
	TreeViewAdapter adapter;
	SuperTreeViewAdapter superAdapter;
	Button double_btn, treble_btn;

	public String[] groups = { "friends", "family" };
	public String[][] childs = { { "A", "AA", "AAA" }, { "B", "BB", "BBB" } };

	public String[] parent = { "boys", "girls" };
	public String[][][] child_grandchild = { { { "Toms" }, { "A", "AA" } },
			{ { "Kelly" }, { "B", "BBB" } } };

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		double_btn = (Button) findViewById(R.id.button1);
		treble_btn = (Button) findViewById(R.id.button2);
		expandableListView = (ExpandableListView) findViewById(R.id.expandablelistview);
		double_btn.setOnClickListener(listener);
		treble_btn.setOnClickListener(listener);
		adapter = new TreeViewAdapter(this, 38);
		superAdapter = new SuperTreeViewAdapter(this, stvClickEvent);
	}

	public OnClickListener listener = new OnClickListener() {

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			adapter.removeAll();
			adapter.notifyDataSetChanged();
			superAdapter.RemoveAll();
			superAdapter.notifyDataSetChanged();
			if (v == double_btn) {
				List<TreeViewAdapter.TreeNode> treeNode = adapter.getTreeNode();
				for (int i = 0; i < groups.length; i++) {
					TreeViewAdapter.TreeNode node = new TreeViewAdapter.TreeNode();
					node.parent = groups[i];
					for (int j = 0; j < childs[i].length; j++) {
						node.childs.add(childs[i][j]);
					}
					treeNode.add(node);
				}
				adapter.updateTreeNode(treeNode);
				expandableListView.setAdapter(adapter);
				expandableListView
						.setOnChildClickListener(new OnChildClickListener() {

							@Override
							public boolean onChildClick(
									ExpandableListView parent, View v,
									int groupPosition, int childPosition,
									long id) {
								String str = "parent_id = " + groupPosition
										+ " child_id = " + childPosition;
								Toast.makeText(ExpandableListViewActivity.this,
										str, Toast.LENGTH_SHORT).show();
								return false;
							}
						});
			} else if (v == treble_btn) {
				List<SuperTreeViewAdapter.SuperTreeNode> superNodeTree = superAdapter
						.GetTreeNode();
				for (int i = 0; i < parent.length; i++) {
					SuperTreeViewAdapter.SuperTreeNode superNode = new SuperTreeViewAdapter.SuperTreeNode();
					superNode.parent = parent[i];

					for (int j = 0; j < child_grandchild.length; j++) {
						TreeViewAdapter.TreeNode node = new TreeViewAdapter.TreeNode();
						node.parent = child_grandchild[j][0][0];
						for (int k = 0; k < child_grandchild[j][1].length; k++) {
							node.childs.add(child_grandchild[j][1][k]);
						}
						superNode.childs.add(node);
					}
					superNodeTree.add(superNode);
				}
				superAdapter.UpdateTreeNode(superNodeTree);
				expandableListView.setAdapter(superAdapter);
			}
		}

	};

	OnChildClickListener stvClickEvent = new OnChildClickListener() {

		@Override
		public boolean onChildClick(ExpandableListView parent, View v,
				int groupPosition, int childPosition, long id) {
			// TODO Auto-generated method stub
			String msg = "parent_id = " + groupPosition + " child_id = "
					+ childPosition;
			Toast.makeText(ExpandableListViewActivity.this, msg,
					Toast.LENGTH_SHORT).show();
			return false;
		}
	};
}


SuperTreeViewAdapter

package com.yhx.expandablelistview;

import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import com.yhx.expandablelistview.TreeViewAdapter.TreeNode;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.TextView;

//构建树形菜单
public class SuperTreeViewAdapter extends BaseExpandableListAdapter {

	static public class SuperTreeNode {
		Object parent;
		//二级树形菜单的结构体
		List<TreeViewAdapter.TreeNode> childs = new ArrayList<TreeViewAdapter.TreeNode>();
	}

	private List<SuperTreeNode> superTreeNodes = new ArrayList<SuperTreeNode>();
	private Context parentContext;
	private OnChildClickListener stvClickEvent;//外部回调函数
	
	public SuperTreeViewAdapter(Context view,OnChildClickListener stvClickEvent) {
		parentContext = view;
		this.stvClickEvent=stvClickEvent;
	}

	public List<SuperTreeNode> GetTreeNode() {
		return superTreeNodes;
	}

	public void UpdateTreeNode(List<SuperTreeNode> node) {
		superTreeNodes = node;
	}
	
	public void RemoveAll()
	{
		superTreeNodes.clear();
	}
	
	public Object getChild(int groupPosition, int childPosition) {
		return superTreeNodes.get(groupPosition).childs.get(childPosition);
	}

	public int getChildrenCount(int groupPosition) {
		return superTreeNodes.get(groupPosition).childs.size();
	}

	public ExpandableListView getExpandableListView() {
		AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
				ViewGroup.LayoutParams.FILL_PARENT, TreeViewAdapter.ItemHeight);
		ExpandableListView superTreeView = new ExpandableListView(parentContext);
		superTreeView.setLayoutParams(lp);
		return superTreeView;
	}

	/**
	 * 三层树结构中的第二层是一个ExpandableListView
	 */	
	public View getChildView(int groupPosition, int childPosition,
			boolean isLastChild, View convertView, ViewGroup parent) {
		// 是 
		final ExpandableListView treeView = getExpandableListView();
		final TreeViewAdapter treeViewAdapter = new TreeViewAdapter(this.parentContext,0);
		List<TreeNode> tmp = treeViewAdapter.getTreeNode();//临时变量取得TreeViewAdapter的TreeNode集合,可为空
		final TreeNode treeNode=(TreeNode) getChild(groupPosition, childPosition);
		tmp.add(treeNode);
		treeViewAdapter.updateTreeNode(tmp);
		treeView.setAdapter(treeViewAdapter);
		
		//关键点:取得选中的二级树形菜单的父子节点,结果返回给外部回调函数
		treeView.setOnChildClickListener(this.stvClickEvent);
		
		/**
		 * 关键点:第二级菜单展开时通过取得节点数来设置第三级菜单的大小
		 */
		treeView.setOnGroupExpandListener(new OnGroupExpandListener() {
			@Override
			public void onGroupExpand(int groupPosition) {
				
				AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
						ViewGroup.LayoutParams.FILL_PARENT,
						(treeNode.childs.size()+1)*TreeViewAdapter.ItemHeight + 10);
				treeView.setLayoutParams(lp);
			}
		});
		
		/**
		 * 第二级菜单回收时设置为标准Item大小
		 */
		treeView.setOnGroupCollapseListener(new OnGroupCollapseListener() {
			@Override
			public void onGroupCollapse(int groupPosition) {
				
				AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
						TreeViewAdapter.ItemHeight);
				treeView.setLayoutParams(lp);
			}
		});
		treeView.setPadding(TreeViewAdapter.PaddingLeft*2, 0, 0, 0);
		return treeView;
	}

	/**
	 * 三级树结构中的首层是TextView,用于作为title
	 */
	public View getGroupView(int groupPosition, boolean isExpanded,
			View convertView, ViewGroup parent) {
		TextView textView = TreeViewAdapter.getTextView(this.parentContext);
		textView.setText(getGroup(groupPosition).toString());
		textView.setPadding(TreeViewAdapter.PaddingLeft*2, 0, 0, 0);
		return textView;
	}

	public long getChildId(int groupPosition, int childPosition) {
		return childPosition;
	}

	public Object getGroup(int groupPosition) {
		return superTreeNodes.get(groupPosition).parent;
	}

	public int getGroupCount() {
		return superTreeNodes.size();
	}

	public long getGroupId(int groupPosition) {
		return groupPosition;
	}

	public boolean isChildSelectable(int groupPosition, int childPosition) {
		return true;
	}

	public boolean hasStableIds() {
		return true;
	}
}


TreeViewAdapter

package com.yhx.expandablelistview;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;

public class TreeViewAdapter extends BaseExpandableListAdapter {

	public static final int ItemHeight = 48;
	public static final int PaddingLeft = 38;
	private int myPaddingLeft = 0;

	static public class TreeNode {
		Object parent;
		List<Object> childs = new ArrayList<Object>();
	}

	List<TreeNode> treeNodes = new ArrayList<TreeNode>();
	Context parentContext;

	public TreeViewAdapter(Context context, int myPaddingLeft) {
		parentContext = context;
		this.myPaddingLeft = myPaddingLeft;

	}

	public List<TreeNode> getTreeNode() {
		return treeNodes;
	}

	public void updateTreeNode(List<TreeNode> nodes) {
		treeNodes = nodes;
	}

	public void removeAll() {
		treeNodes.clear();
	}

	@Override
	public Object getChild(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return treeNodes.get(groupPosition).childs.get(childPosition);
	}

	@Override
	public long getChildId(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return childPosition;
	}

	static public TextView getTextView(Context context) {
		AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
				ViewGroup.LayoutParams.FILL_PARENT, ItemHeight);
		TextView textView = new TextView(context);
		textView.setLayoutParams(lp);
		textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
		return textView;
	}

	@Override
	public View getChildView(int groupPosition, int childPosition,
			boolean isLastChild, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		TextView textView = getTextView(this.parentContext);
		textView.setText(getChild(groupPosition, childPosition).toString());
		textView.setPadding(myPaddingLeft + PaddingLeft, 0, 0, 0);
		return textView;
	}

	@Override
	public int getChildrenCount(int groupPosition) {
		// TODO Auto-generated method stub
		return treeNodes.get(groupPosition).childs.size();
	}

	@Override
	public Object getGroup(int groupPosition) {
		// TODO Auto-generated method stub
		return treeNodes.get(groupPosition).parent;
	}

	@Override
	public int getGroupCount() {
		// TODO Auto-generated method stub
		return treeNodes.size();
	}

	@Override
	public long getGroupId(int groupPosition) {
		// TODO Auto-generated method stub
		return groupPosition;
	}

	@Override
	public View getGroupView(int groupPosition, boolean isExpanded,
			View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		TextView textView = getTextView(this.parentContext);
		textView.setText(getGroup(groupPosition).toString());
		textView.setPadding(myPaddingLeft + (PaddingLeft >> 1), 0, 0, 0);
		return textView;
	}

	@Override
	public boolean hasStableIds() {
		// TODO Auto-generated method stub
		return true;
	}

	@Override
	public boolean isChildSelectable(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return true;
	}

}


SuperTreeNode

package com.yhx.expandablelistview;

import java.util.ArrayList;
import java.util.List;

public class SuperTreeNode {
	public Object parent;
	public List<TreeViewAdapter.TreeNode> childs = new ArrayList<TreeViewAdapter.TreeNode>();
}


TreeNode

package com.yhx.expandablelistview;

import java.util.ArrayList;
import java.util.List;

public class TreeNode {

	public Object parent;
	public List<Object> childs = new ArrayList<Object>();
}


完整的项目下载地址:点击这里
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: