随笔 - 62  文章 - 0  评论 - 114  阅读 - 18万

在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>
复制代码


效果图 :

三层列表

 

二层列表

 源码下载:ExpandableListView.rar

posted on   nuliniao  阅读(11663)  评论(2编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2012年11月 >
28 29 30 31 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示