ExpandableListView的简单案例

ExpandableListView介绍:

长话短说,ExpandableListView就是ListView的扩展。像QQ好友分组列表。看下面的效果图,就知道了。

效果图:

ExpandableListView有几个属性值得一说:

android:childDivider

来分离子列表项的图片或者是颜色。注:图片不会完全显示,分离子列表项的是一条直线

android:childIndicator

在子列表项旁边显示的指示符。注:可以是一个图片

android:childIndicatorLeft

子列表项指示符的左边约束位置。注:即从左端0位置开始计数,比如,假设指示符是一个图标,给定这个属性值为3dip,则表示从左端起3dip开始显示此图标。

android:childIndicatorRight

子列表项指示符的右边约束位置。注:表示右端到什么位置结束

android:groupIndicator

在组列表项旁边显示的指示符。注:可以是一个图片,如果不想要指示器可以设置为@null。

android:indicatorLeft

组列表项指示器的左边约束位置。注:表示左端从什么位置开始(测试了下,在android 4.4的模拟器下没效果)。

android:indicatorRight

组列表项指示器的右边约束位置。注:表示右端到什么位置结束(测试了下,在android 4.4的模拟器下没效果)。

代码:

package cn.datian.expandablelistviewtest2;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;

@SuppressLint("NewApi")
public class MainActivity extends Activity {

    /**
     * 子类的数据集合
     */
    private List<List<String>> childrenList;
    /**
     * 组集合
     */
    private List<String> groupList;

    private ExpandableListView eListView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initDate();
        eListView = (ExpandableListView) this.findViewById(R.id.eListView);
        eListView.setAdapter(adapter);
        //展开第一组,调用了expandGroup(4,false);
        eListView.expandGroup(0);
        //下标从0开始,展开第五组,为true表示滚动到第五组的位置。
//        eListView.expandGroup(4,true);

        eListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {

            @Override
            public boolean onGroupClick(ExpandableListView parent, View v,
                    int groupPosition, long id) {
                Toast.makeText(MainActivity.this, "你点击了:"+groupList.get(groupPosition),Toast.LENGTH_SHORT).show();
                return false;
            }
        });

        //点击组下的子条目监听
        eListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {

            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                    int groupPosition, int childPosition, long id) {
                Toast.makeText(MainActivity.this, "你点击了:"+childrenList.get(groupPosition).get(childPosition), Toast.LENGTH_SHORT).show();
                return true;
            }
        });
    }

    /**
     * 初始化数据
     */
    private void initDate() {

        childrenList = new ArrayList<List<String>>();
        groupList = new ArrayList<String>();

        addDate("小学","张三");
        addDate("中学","李四");
        addDate("高中","王五");
        addDate("大学","赵六");
        addDate("硕士","小红");
        addDate("博士","小明");
        addDate("博士后","大明");

    }

    private void addDate(String group, String chlidren) {

        groupList.add(group);
        List<String> cs = new ArrayList<String>();
        for(int i = 0;i < 10;i++){
            cs.add(chlidren+i);
        }
        childrenList.add(cs);
    }

    BaseExpandableListAdapter adapter = new BaseExpandableListAdapter() {

        /**
         * 返回true,表明子条目是可选的。
         */
        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            Log.i("adpter", "isChildSelectable");
            return true;
        }

        @Override
        public boolean hasStableIds() {
            Log.i("adpter", "hasStableIds");
            return false;
        }

        @Override
        public View getGroupView(int groupPosition, boolean isExpanded,
                View convertView, ViewGroup parent) {

            Log.i("adpter", "getGroupView");
            View v = View.inflate(MainActivity.this, R.layout.group_item,null);

            TextView tv=  (TextView) v.findViewById(R.id.tv);
            tv.setText(groupList.get(groupPosition));
            tv.setPadding(20, 0, 0, 0);
            return v;
        }

        @Override
        public long getGroupId(int groupPosition) {
            Log.i("adpter", "getGroupId");
            return groupPosition;
        }

        @Override
        public int getGroupCount() {
            Log.i("adpter", "getGroupCount");
            return groupList.size();
        }

        @Override
        public Object getGroup(int groupPosition) {
            Log.i("adpter", "getGroup");
            return groupList.get(groupPosition);
        }

        @Override
        public int getChildrenCount(int groupPosition) {
            Log.i("adpter", "getChildrenCount");
            return childrenList.get(groupPosition).size();
        }

        @Override
        public View getChildView(int groupPosition, int childPosition,
                boolean isLastChild, View convertView, ViewGroup parent) {
            Log.i("adpter", "getChildView");
            TextView tv = new TextView(MainActivity.this);
            tv.setText(childrenList.get(groupPosition).get(childPosition));
            tv.setPadding(20, 0, 0, 0);
            return tv;
        }

        @Override
        public long getChildId(int groupPosition, int childPosition) {
            Log.i("adpter", "getChildId");
            return childrenList.get(groupPosition).size();
        }

        @Override
        public Object getChild(int groupPosition, int childPosition) {
            Log.i("adpter", "getChild");
            return childrenList.get(groupPosition).get(childPosition);
        }
    };
}

layout布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     >

    <ExpandableListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/eListView"
        android:groupIndicator="@drawable/expandable_indicator_selector"
        android:indicatorLeft="5dp"
        android:indicatorRight="30dp"
        ></ExpandableListView>
</RelativeLayout>

layout组条目布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_margin="10dp"
    >
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:text=""
        android:textSize="20sp"
        android:layout_marginLeft="40dp"
        android:gravity="center_vertical"
        />
</LinearLayout>
android:groupIndicator="@drawable/expandable_indicator_selector" : 使用选择器

选择器代码:
<?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/contract" />
    <item android:drawable="@drawable/expand"></item>
</selector>

ExpandableListView的简单案例

时间: 2024-10-28 20:45:30

ExpandableListView的简单案例的相关文章

Android ExpandableListView的简单应用

Expandablelistview1Activity.java package com.wangzhu.demoexpandablelistview; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.widg

keepalived简单案例

---------------------------------- 一.前言 二.环境 三.Keepalived体系架构 四.安装Keepalived 五.案例配置 ---------------------------------- 一.前言 keepalived是一个类似于layer3,4&5交换机制的软件,也就是我们平时说的第3层.第4层和第5层交换.Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的

[Design Pattern] Mediator Pattern 简单案例

Meditor Pattern,即调解模式,用一个调解类类处理所有的沟通事件,使得降低多对象之间的沟通难度,属于行为类的设计模式.为了方便理解记忆,我也称其为,沟通模式. 下面是一个调解模式的简单案例. ChatRoom 提供公用发送短信的方法.User 全部通过 ChatRoom 类发送信息进行沟通.MediatorPatternDemo 演示调解模式. 代码实现 ChatRoom 提供发送信息的方法 public class ChatRoom { public static void sho

[Design Pattern] Iterator Pattern 简单案例

Iterator Pattern,即迭代时模式,按照顺序依次遍历集合内的每一个元素,而不用了解集合的底层实现,属于行为类的设计模式.为了方便理解记忆,我也会称其为遍历模式. 下面是一个迭代器模式的简单案例. Iterator 定义了迭代接口, 仅 hasNext 和 next 两个方法.Container 定义了集合的接口,必须包含一个返回迭代器类 Iterator 的方法.NameRepository 是容器的具体类,实现 Container 接口,并拥有一个内部类 NameIterator

[Design Pattern] Observer Pattern 简单案例

Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式. 下面是一个观察者模式的简单案例. Observer 定义观察者的接口,定义需要观察的对象,已经被通知的接口.BinaryObserver, OctalObserver, HexaObserver 各自实现了 Observer 接口. Subject 是被观察的对象,记录了观察该对象的观察者列表,自身有变动,即可通知观察者列表中的各个观察者. 代码实现

[Design Pattern] Command Pattern 简单案例

Command Pattern, 即命令模式,把一个命令包裹在一个对象里面,将命令对象传递给命令的执行方,属于行为类的设计模式 下面是命令模式的一个简单案例. Stock 代表被操作的对象.Order 定义命令的接口,BuyStock, SellStock 是具体类,实现 Order 接口.Broker 是命令的执行方.CommandPatternDemo 演示命令模式. 代码实现 Order, 命令接口 public interface Order { public void execute(

[Design Pattern] Proxy Pattern 简单案例

Proxy Pattern, 即代理模式,用一个类代表另一个类的功能,用于隐藏.解耦真正提供功能的类,属于结构类的设计模式. 下面是 代理模式的一个简单案例. Image 定义接口,RealImage, ProxyImage 都实现该接口.RealImage 具有真正显示功能,ProxyImage 作为代表,暴露给客户端使用. 代码实现: public interface Image { public void display(); } RealImage 的实现,提供真正的功能 public

[Design Pattern] Facde Pattern 简单案例

Facade Pattern, 即外观模式,用于隐藏复杂的系统内部逻辑,提供简洁的接口给客户端调用,属于结构类的设计模式.我会将其名字理解为,门户模式. 下面是 Facade Pattern 的一个简单案例. Shape 定义一个接口,Circle, rectangle, Square 分别实现 Shape 接口,代表系统内部的一个功能.ShapeMaker 作为一个对外类,提供简洁的接口给外部调用. 代码实现: Shape 接口 public interface Shape { public

[Design Pattern] Flywight Pattern 简单案例

Flywight Pattern, 即享元模式,用于减少对象的创建,降低内存的占用,属于结构类的设计模式.根据名字,我也将其会理解为 轻量模式. 下面是享元模式的一个简单案例. 享元模式,主要是重用已有的对象,通过修改部分属性重新使用,避免申请大量内存. 本模式需要主要两个点: 1. 对象的 key 应该是不可变得,本例中 color 作为 key,所以我在 color 前添加了 final 的修饰符. 2. 并非线程安全,多个线程同时获取一个对象,并同时修改其属性,会导致无法预计的结果. 代码