入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

Android---多级树形菜单的实现

创建时间:2016-04-26 投稿人: 浏览次数:1033
本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!

       在Android里要实现树形菜单,都是用ExpandableList(也有高手自己继承ListView或者LinearLayout来做),但是ExpandableList一般只能实现2级树形菜单......本文也依然使用ExpandableList,但是要实现的是3级树形菜单。本文程序运行效果图:


当用BaseExpandableListAdapter来实现二级树形菜单时,父项(getGroupView())和子项(getChildView())都是使用TextView。当要实现三级树形菜单时,子项(getChildView())就必须使用ExpandableList了.......另外还要定义结构体来方便调用三级树形的数据,二级树形菜单可以用如下:

[java] view plaincopyprint?
  1. static public class TreeNode{  
  2.     Object parent;  
  3.     List<Object> childs=new ArrayList<Object>();  
  4. }  

三级树形菜单可以用如下,子项是二级树形菜单的结构体:

[java] view plaincopyprint?
  1. static public class SuperTreeNode {  
  2.     Object parent;  
  3.     //二级树形菜单的结构体  
  4.     List<TreeViewAdapter.TreeNode> childs = new ArrayList<TreeViewAdapter.TreeNode>();  
  5. }  

实现三级树形菜单有两点要注意的:

1、第二级也是个树形菜单,因此必须在第二级项目展开/回收时设置足够的空间来完全显示二级树形菜单;

2、在实现三级树形菜单时,发现菜单的方法都是用不了(如OnChildClickListener、OnGroupClickListener等),因此要获得选中的数据就必须在外部定义好回调函数,然后在第二级生成二级树形菜单时回调这个外部函数。

PS:本文在解决No.2关键点的时候,只能取得第三级选中的序号.....而第一,第二级依然无法获取其序号。

main.xml源码如下:

[xhtml] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent">  
  5.     <LinearLayout android:id="@+id/LinearLayout01"  
  6.         android:layout_width="wrap_content" android:layout_height="wrap_content">  
  7.         <Button android:layout_height="wrap_content" android:text="两层结构"  
  8.             android:layout_width="160dip" android:id="@+id/btnNormal"></Button>  
  9.         <Button android:layout_height="wrap_content" android:text="三层结构"  
  10.             android:layout_width="160dip" android:id="@+id/btnSuper"></Button>  
  11.     </LinearLayout>  
  12.     <ExpandableListView android:id="@+id/ExpandableListView01"  
  13.         android:layout_width="fill_parent" android:layout_height="fill_parent"></ExpandableListView>  
  14. </LinearLayout>  

testExpandableList.java是主类,调用其他工具类,源码如下:

[java] view plaincopyprint?
  1. package com.testExpandableList;  
  2.   
  3.   
  4. import java.util.List;  
  5. import android.app.Activity;  
  6. import android.os.Bundle;  
  7. import android.util.Log;  
  8. import android.view.View;  
  9. import android.widget.Button;  
  10. import android.widget.ExpandableListView;  
  11. import android.widget.ExpandableListView.OnChildClickListener;  
  12. import android.widget.Toast;  
  13.   
  14. public class testExpandableList extends Activity {  
  15.     /** Called when the activity is first created. */  
  16.     ExpandableListView expandableList;  
  17.     TreeViewAdapter adapter;  
  18.     SuperTreeViewAdapter superAdapter;  
  19.     Button btnNormal,btnSuper;  
  20.     // Sample data set.  children[i] contains the children (String[]) for groups[i].  
  21.     public String[] groups = { "xxxx好友", "xxxx同学", "xxxxx女人"};  
  22.     public String[][]  child= {  
  23.             { "A君", "B君", "C君", "D君" },  
  24.             { "同学甲", "同学乙", "同学丙"},  
  25.             { "御姐", "萝莉" }  
  26.     };  
  27.       
  28.     public String[] parent = { "xxxx好友", "xxxx同学"};  
  29.     public String[][][]  child_grandson= {  
  30.             {{"A君"},  
  31.                 {"AA","AAA"}},  
  32.             {{"B君"},  
  33.                 {"BBB","BBBB","BBBBB"}},  
  34.             {{"C君"},  
  35.                 {"CCC","CCCC"}},  
  36.             {{"D君"},  
  37.                 {"DDD","DDDD","DDDDD"}},  
  38.     };  
  39.       
  40.     @Override  
  41.     public void onCreate(Bundle savedInstanceState) {  
  42.         super.onCreate(savedInstanceState);  
  43.         setContentView(R.layout.main);  
  44.         this.setTitle("ExpandableListView练习----hellogv");  
  45.         btnNormal=(Button)this.findViewById(R.id.btnNormal);  
  46.         btnNormal.setOnClickListener(new ClickEvent());  
  47.         btnSuper=(Button)this.findViewById(R.id.btnSuper);  
  48.         btnSuper.setOnClickListener(new ClickEvent());  
  49.         adapter=new TreeViewAdapter(this,TreeViewAdapter.PaddingLeft>>1);  
  50.         superAdapter=new SuperTreeViewAdapter(this,stvClickEvent);  
  51.         expandableList=(ExpandableListView) testExpandableList.this.findViewById(R.id.ExpandableListView01);  
  52.     }  
  53.       
  54.     class ClickEvent implements View.OnClickListener{  
  55.   
  56.         @Override  
  57.         public void onClick(View v) {  
  58.             adapter.RemoveAll();  
  59.             adapter.notifyDataSetChanged();  
  60.             superAdapter.RemoveAll();  
  61.             superAdapter.notifyDataSetChanged();  
  62.               
  63.             if(v==btnNormal)  
  64.             {  
  65.                 List<TreeViewAdapter.TreeNode> treeNode = adapter.GetTreeNode();  
  66.                 for(int i=0;i<groups.length;i++)  
  67.                 {  
  68.                     TreeViewAdapter.TreeNode node=new TreeViewAdapter.TreeNode();  
  69.                     node.parent=groups[i];  
  70.                     for(int ii=0;ii<child[i].length;ii++)  
  71.                     {  
  72.                         node.childs.add(child[i][ii]);  
  73.                     }  
  74.                     treeNode.add(node);  
  75.                 }  
  76.                   
  77.                 adapter.UpdateTreeNode(treeNode);       
  78.                 expandableList.setAdapter(adapter);  
  79.                 expandableList.setOnChildClickListener(new OnChildClickListener(){  
  80.   
  81.                     @Override  
  82.                     public boolean onChildClick(ExpandableListView arg0, View arg1,  
  83.                             int parent, int children, long arg4) {  
  84.                           
  85.                         String str="parent id:"+String.valueOf(parent)+",children id:"+String.valueOf(children);  
  86.                         Toast.makeText(testExpandableList.this, str, 300).show();  
  87.                         return false;  
  88.                     }  
  89.                 });  
  90.             }  
  91.             else if(v==btnSuper){  
  92.                 List<SuperTreeViewAdapter.SuperTreeNode> superTreeNode = superAdapter.GetTreeNode();  
  93.                 for(int i=0;i<parent.length;i++)//第一层  
  94.                 {  
  95.                     SuperTreeViewAdapter.SuperTreeNode superNode=new SuperTreeViewAdapter.SuperTreeNode();  
  96.                     superNode.parent=parent[i];  
  97.                       
  98.                     //第二层  
  99.                     for(int ii=0;ii<child_grandson.length;ii++)  
  100.                     {  
  101.                         TreeViewAdapter.TreeNode node=new TreeViewAdapter.TreeNode();  
  102.                         node.parent=child_grandson[ii][0][0];//第二级菜单的标题  
  103.                           
  104.                         for(int iii=0;iii<child_grandson[ii][1].length;iii++)//第三级菜单  
  105.                         {  
  106.                             node.childs.add(child_grandson[ii][1][iii]);  
  107.                         }  
  108.                         superNode.childs.add(node);  
  109.                     }  
  110.                     superTreeNode.add(superNode);  
  111.                       
  112.                 }  
  113.                 superAdapter.UpdateTreeNode(superTreeNode);  
  114.                 expandableList.setAdapter(superAdapter);  
  115.             }  
  116.         }  
  117.     }  
  118.   
  119.     /** 
  120.      * 三级树形菜单的事件不再可用,本函数由三级树形菜单的子项(二级菜单)进行回调 
  121.      */  
  122.     OnChildClickListener stvClickEvent=new OnChildClickListener(){  
  123.   
  124.         @Override  
  125.         public boolean onChildClick(ExpandableListView parent,  
  126.                 View v, int groupPosition, int childPosition,  
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。