android下ExpandableListView的详细使用demo
2013-03-22 11:26
543 查看
一直认为ExpandableListView是比较好的一个东西,虽然不常用,但是上次网上查资料看到了这个demo,研究了一下,标记一下,以后使用的时候来看看。
效果图如下:
ExpandableListViewActivity
SuperTreeViewAdapter
TreeViewAdapter
SuperTreeNode
TreeNode
完整的项目下载地址:点击这里
效果图如下:
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>(); }
完整的项目下载地址:点击这里
相关文章推荐
- Android自带控件ExpandableListView的使用
- Android 使用PullToRefresh实现下拉刷新和上拉加载(ExpandableListView)
- Android中ExpandableListView的使用
- Android中ExpandableListView的使用
- Android ExpandableListView使用+获取SIM卡状态信息
- Android ExpandableListView使用
- Android ExpandableListView展开列表控件使用实例
- ExpandableListView (二级列表)使用demo
- android开发之ExpandableListView的使用,实现类似QQ好友列表
- Android中级联列表ExpandableListView使用
- Android中ExpandableListView的使用
- Android ExpandableListView的使用
- Android中的ExpandableListView的使用,以及点击时间禁用,并展开group,去掉小三角
- Android:ExpandableListView使用
- Android ExpandableListView的使用
- android-ExpandableListView的使用
- Android-Universal-Image-Loader使用demo,超详细!!!
- Android中ExpandableListView的使用
- Android ExpandableListView的使用
- Android ExpandableListView 的简单使用