在android里用ExpandableListView实现二层和三层列表源码

二层列表是直接用androidAPI中的ExpandableListView即可实现,三层列表其实是对二层列表的一个嵌套,实现起来会相对繁琐。

部分代码:

SuperTreeViewAdapter.java

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

ExpandableListViewActivity.java

List<SuperTreeViewAdapter.SuperTreeNode> superNodeTree = superAdapter.GetTreeNode();                forint i = 0; i < parent.length; i++) {                    SuperTreeViewAdapter.SuperTreeNode superNode = new SuperTreeViewAdapter.SuperTreeNode();                    superNode.parent = parent[i];    forint j = 0; j < child_grandchild.length; j++) {                        TreeViewAdapter.TreeNode node = new TreeViewAdapter.TreeNode();                        node.parent = child_grandchild[j][0][0];                       forint 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);    

main.xml

<LinearLayout        android:id="@+id/linearLayout1"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:gravity="center" >        <Button            android:id="@+id/button1"            android:layout_width="100dip"            android:layout_height="wrap_content"            android:text="二层结构" />        <Button            android:id="@+id/button2"            android:layout_width="100dip"            android:layout_height="wrap_content"            android:text="三层结构" />    </LinearLayout>    <ExpandableListView        android:id="@+id/expandablelistview"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        >    </ExpandableListView>


效果图 :

三层列表

二层列表

更多相关文章

  1. 【Android】常量DEFAULT_KEYS_SHORTCUT 功能的验证 及其 源码实
  2. 【Android】对话框之AlertDialog
  3. android2.3 api demo 学习系列(20)--App/Menu
  4. 【Android(安卓)开发教程】选项菜单
  5. 一步一步学习android(1)---Menu
  6. android fragment学习4-底部布局扩展TabLayout
  7. android菜单menu详解
  8. 应用程序的目录结构解析
  9. ffmpeg--把一个eclipse目录结构的Android工程转为Android(安卓)S

随机推荐

  1. gif in android
  2. Android学习路线总结,绝对干货
  3. ImageView之android:tint=" "属性方法作
  4. Android(安卓)SDCard Mount 流程分析(一)
  5. Android(安卓)应用程序快速启动的秘诀
  6. 【Android(安卓)开发】: Android(安卓)消
  7. android中的SVG图像的各个属性意义
  8. android局部更新(RecyclerView+ DiffUtil
  9. RelativeLayout 相对布局
  10. Android中View的事件执行机制