`

使用ExpandableListView

 
阅读更多

效果图


 

Group右边的图标是Android系统自动加上的默认图标

 

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
    <ExpandableListView android:id="@+id/expandable_list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

 

 

package com.improve;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
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.Toast;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.TextView;

/**
 * ExpandableListView只能是两级层次
 * @author Davee
 */
public class ExpandableListViewDemo extends Activity {
    private List<String> groupData;
    private List<List<String>> childrenData;
    private void loadData() {
        groupData = new ArrayList<String>();
        groupData.add("Group 1");
        groupData.add("Group 2");
        groupData.add("Group 3");

        childrenData = new ArrayList<List<String>>();
        List<String> sub1 = new ArrayList<String>();
        sub1.add("G1 Item 1");
        sub1.add("G1 Item 2");
        childrenData.add(sub1);
        List<String> sub2 = new ArrayList<String>();
        sub2.add("G2 Item 1");
        sub2.add("G2 Item 2");
        sub2.add("G2 Item 3");
        sub2.add("G2 Item 4");
        childrenData.add(sub2);
        List<String> sub3 = new ArrayList<String>();
        sub3.add("G3 Item 1");
        sub3.add("G3 Item 2");
        sub3.add("G3 Item 3");
        sub3.add("G3 Item 4");
        sub3.add("G3 Item 5");
        childrenData.add(sub3);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.expandable_list_view);
        
        loadData();
        
        ExpandableListView expandableListView = (ExpandableListView)findViewById(R.id.expandable_list_view);
        expandableListView.setAdapter(new ExpandableAdapter());
        expandableListView.setOnGroupClickListener(new OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View clickedView, int groupPosition, long groupId) {
                showMessage("点击Group: " + ((TextView)clickedView).getText());
                return false;//返回true表示此事件在此被处理了
            }
        });
        expandableListView.setOnChildClickListener(new OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView expandablelistview,
                    View clickedView, int groupPosition, int childPosition, long childId) {
                showMessage("点击Child: " + ((TextView)clickedView).getText());
                return false;//返回true表示此事件在此被处理了
            }
        });
        expandableListView.setOnGroupCollapseListener(new OnGroupCollapseListener() {
            @Override
            public void onGroupCollapse(int groupPosition) {
                showMessage("合拢Group: " + (groupPosition + 1));
            }
        });
        expandableListView.setOnGroupExpandListener(new OnGroupExpandListener() {
            @Override
            public void onGroupExpand(int groupPosition) {
                showMessage("展开Group: " + (groupPosition + 1));
            }
        });
    }
    
    private class ExpandableAdapter extends BaseExpandableListAdapter {

        @Override
        public Object getChild(int groupPosition, int childPosition) {
            return childrenData.get(groupPosition).get(childPosition);
        }

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

        @Override
        public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
            TextView text = null;
            if (convertView != null) {
                text = (TextView)convertView;
                text.setText(childrenData.get(groupPosition).get(childPosition));
            } else {
                text = createView(childrenData.get(groupPosition).get(childPosition));
            }
            return text;
        }

        @Override
        public int getChildrenCount(int groupPosition) {
            return childrenData.get(groupPosition).size();
        }

        @Override
        public Object getGroup(int groupPosition) {
            return groupData.get(groupPosition);
        }

        @Override
        public int getGroupCount() {
            return groupData.size();
        }

        @Override
        public long getGroupId(int groupPosition) {
            return 0;
        }

        @Override
        public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
            TextView text = null;
            if (convertView != null) {
                text = (TextView)convertView;
                text.setText(groupData.get(groupPosition));
            } else {
                text = createView(groupData.get(groupPosition));
            }
            return text;
        }

        @Override
        public boolean hasStableIds() {
            return false;
        }

        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return false;
        }
        
        private TextView createView(String content) {
            AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams(  
                    ViewGroup.LayoutParams.FILL_PARENT, 38);  
            TextView text = new TextView(ExpandableListViewDemo.this);  
            text.setLayoutParams(layoutParams);  
            text.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);  
            text.setPadding(40, 0, 0, 0);  
            text.setText(content);
            return text;
        }
    }
    
    private void showMessage(String message) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }
}

 

 

在上面效果图中,图标是系统自动加上的,也可以定义自己的图标

效果图


 

增加drawable文件

 

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_expanded="true" android:drawable="@drawable/narrow_expand" />
    <item android:drawable="@drawable/narrow_unexpand" />
</selector>
 

修改布局

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
    <ExpandableListView android:id="@+id/expandable_list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:groupIndicator="@drawable/group_icon_selector" />
</LinearLayout>
 

 

 

 

 

  • 大小: 17.7 KB
  • 大小: 13.9 KB
分享到:
评论
4 楼 Jacarri_Chan 2012-09-21  
赞一个赞一个
3 楼 zw_lovec 2012-07-06  
很给力 赞一个~
2 楼 昔雪似花 2011-12-08  
昔雪似花 写道

1 楼 昔雪似花 2011-12-08  

相关推荐

    Android使用ExpandableListview实现时间轴TimeLineDemo.zip

    本示例“Android使用ExpandableListview实现时间轴TimeLineDemo”就是基于`ExpandableListView`来创建一个可展开的时间轴效果。 首先,我们要理解`ExpandableListView`的基本工作原理。它允许每个列表项(group)都...

    Android开发丶教你使用ExpandableListView一步步从零实现商城购物车(含demo超详细)

    在"Android开发丶教你使用ExpandableListView一步步从零实现商城购物车(含demo超详细)"中,开发者将指导我们如何利用`ExpandableListView`来创建一个完整的购物车系统。 首先,我们需要理解`ExpandableListView`...

    Android使用ExpandableListview实现时间轴

    下面将详细介绍如何在Android中使用`ExpandableListView`创建一个时间轴。 首先,我们需要理解`ExpandableListView`的基本概念。它由两部分组成:父项(Group)和子项(Child)。父项代表一级分类,可以展开或折叠...

    Android-使用ExpandableListView实现的购物车

    首先,我们来详细解释`ExpandableListView`的使用。`ExpandableListView`继承自`ListView`,它提供了扩展的功能,使得每个列表项可以展开显示子列表项。要使用`ExpandableListView`,开发者需要创建一个`...

    android ExpandableListView三级菜单的使用

    在这个“android ExpandableListView三级菜单的使用”示例中,我们将深入探讨如何创建并操作一个支持三级菜单的`ExpandableListView`。 首先,`ExpandableListView`是`ListView`的扩展,它提供了更丰富的功能,可以...

    ExpandableListView实现二级列表购物车

    下面我们来详细介绍如何使用ExpandableListView实现二级列表购物车。 首先,我们需要在布局文件中添加ExpandableListView组件,例如: ```xml &lt;ExpandableListView android:id="@+id/elv" android:layout_width...

    android ExpandableListView 四级树形目录

    我们可以通过自定义布局文件和使用`setGroupIndicator()`方法来改变展开/折叠指示器的外观,还可以通过设置背景颜色、文字样式等方式调整整体视觉效果。 通过以上步骤,我们可以创建一个四级树形目录的`...

    Android 中使用ExpandableListView 实现分组的实例

    Android 中使用ExpandableListView 实现分组 一个视图显示垂直滚动两级列表中的条目。这不同于列表视图,允许两个层次,类似于QQ的好友分组。要实现这个效果的整体思路为: 1.要给ExpandableListView 设置适配器,...

    ExpandableListView 解决子级背景色混乱 和父级展开项唯一效果实现

    ExpandableListView使用了Adapter的视图复用机制来提高性能,当一个条目滚动出屏幕再滚动回来时,它的背景可能会被错误地设置为之前显示的条目的颜色。为了解决这个问题,我们需要在getView()方法中正确地设置每个...

    expandablelistview例子

    本篇文章将深入探讨如何使用ExpandableListView,以及如何实现数据的添加和更新。 一、ExpandableListView的基本概念 ExpandableListView是ListView的一个扩展,它能够显示一个可展开/折叠的列表,每个列表项可以...

    ExpandableListView动态添加删除 ListView选择demo

    本篇文章将详细探讨如何在Android中使用ExpandableListView进行动态添加和删除操作,以及实现ListView的选择和删除功能。 首先,我们来看ExpandableListView。它是一种特殊的ListView,允许每个条目展开显示子条目...

    ExpandableListView实现时间轴效果

    本文将深入探讨如何利用ExpandableListView控件实现这种效果。ExpandableListView是Android SDK提供的一种可扩展的列表视图,允许用户折叠和展开各个组,每个组下可以包含多个子项,非常适合用来构建层次结构清晰的...

    ExpandableListView的使用之浏览器显示

    在本教程中,我们将深入探讨如何在浏览器应用中有效地使用`ExpandableListView`。 ### 一、ExpandableListView基本概念 `ExpandableListView`是`ListView`的扩展,增加了可折叠和展开的特性。它分为两个主要部分:...

    用expandablelistview实现qq好友分组

    以上就是使用ExpandableListView实现QQ好友分组功能的基本步骤。通过这个控件,我们可以构建出层次清晰、易于操作的列表界面,让用户体验更佳。在实际开发中,还可以根据项目需求进行定制,比如添加头像、显示更多...

    android Expandablelistview使用

    本教程将深入探讨如何在Android应用中使用ExpandableListView,以及如何实现其核心功能。 首先,了解ExpandableListView的基本结构。这个控件由两层数据构成:父组(Group)和子项(Child)。每个父组可以包含多个...

    可展开列表ExpandableListView嵌套GirdView demo

    然而,如果在每个组内需要展示多列数据,单纯使用ExpandableListView可能无法满足需求,这时我们可以考虑将GridView嵌套在ExpandableListView的每个子项中,以实现更加复杂和灵活的布局。下面将详细解释如何实现“可...

    一个ExpandableListView的例子,实现多级菜单分类展示.zip

    在使用ExpandableListView时,我们需要定义两个类:一个表示父项,一个表示子项。通常,父项类会包含一个子项列表,用于存储对应的子项对象。例如,我们可以创建一个`Group`类来代表父项,一个`Child`类来代表子项...

    自定义ListView内嵌GridView,用ExpandableListView实现

    在这种情况下,自定义ListView内嵌GridView或者使用ExpandableListView是常见解决方案。这两种方法可以帮助我们构建具有层次感的列表,使得信息展示更加清晰、易懂。 首先,让我们了解一下ListView。ListView是...

Global site tag (gtag.js) - Google Analytics