Android ExpandableListView的使用

一、MainActivity要继承ExpandableListActivity。效果是当单击ListView的子项是显示另一个ListView。

package com.example.explear;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.app.ExpandableListActivity;
import android.os.Bundle;
import android.transition.SidePropagation;
import android.widget.SimpleExpandableListAdapter;

public class MainActivity extends ExpandableListActivity {
    private static final String NAME = "NAME";
    private static final String IS_EVEN = "IS_EVEN";
    private SimpleExpandableListAdapter eListAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        List<Map<String, String>> groupData = new ArrayList<Map<String, String>>();
        List<List<Map<String, String>>> childDataList = new ArrayList<List<Map<String, String>>>();
        for (int i = 0; i < 10; i++) {
            Map<String, String> curGroupMap = new HashMap<String, String>();
            groupData.add(curGroupMap);
            curGroupMap.put(NAME, "Group" + i);
            curGroupMap.put(IS_EVEN, (i % 2 == 0) ? "This group is even"
                    : "this group is odd");
            List<Map<String, String>> children = new ArrayList<Map<String, String>>();
            for (int j = 0; j < 8; j++) {
                Map<String, String> curChildMap = new HashMap<String, String>();
                children.add(curChildMap);
                curChildMap.put(NAME, "Child" + i);
                curChildMap.put(IS_EVEN, (i % 2 == 0) ? "This chile is even"
                        : "this chile is odd");
            }
            childDataList.add(children);
        }
        eListAdapter = new SimpleExpandableListAdapter(this, groupData,
                android.R.layout.simple_expandable_list_item_2, new String[] {
                        NAME, IS_EVEN }, new int[] { android.R.id.text1,
                        android.R.id.text2 }, childDataList,
                android.R.layout.simple_expandable_list_item_2, new String[] {
                        NAME, IS_EVEN }, new int[] { android.R.id.text1,
                        android.R.id.text2 });
        setListAdapter(eListAdapter);
    }
}

1、groupData是父数据 ,childDataList是子数据。

2、android.R.layout.simple_expandable_list_item_2表示list的实现方式

3、new String[] { NAME,IS_EVEN} list需要显示的数据的键值,真正显示的是键对应的值

效果图:

二、数据源:SimpleCursorTreeAdapter的使用

package com.example.explear;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.app.ExpandableListActivity;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Contacts.People;
import android.transition.SidePropagation;
import android.widget.ExpandableListAdapter;
import android.widget.SimpleCursorTreeAdapter;
import android.widget.SimpleExpandableListAdapter;

public class MainActivity extends ExpandableListActivity {
    private int mGroupIdColumnIndex;
    private String mPhoneNumberProjection[] = new String[] { People.Phones._ID,
            People.Phones.NUMBER };

    private ExpandableListAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 搜索
        Cursor groupCursor = managedQuery(People.CONTENT_URI, new String[] {
                People._ID, People.NAME }, null, null, null);
        // 创建ID 列索引
        mGroupIdColumnIndex = groupCursor.getColumnIndexOrThrow(People._ID);

        // 创建adapter
        mAdapter = new MyExpandableListAdapter(groupCursor, this,
                android.R.layout.simple_expandable_list_item_1,
                android.R.layout.simple_expandable_list_item_1,
                new String[] { People.NAME }, new int[] { android.R.id.text1 },
                new String[] { People.NUMBER },
                new int[] { android.R.id.text1 });
        setListAdapter(mAdapter);
    };

    public class MyExpandableListAdapter extends SimpleCursorTreeAdapter {
        public MyExpandableListAdapter(Cursor cursor, Context context,
                int groupLayout, int childLayout, String[] groupFrom,
                int[] groupTo, String[] childrenFrom, int[] childrenTo) {
            super(context, cursor, groupLayout, groupFrom, groupTo,
                    childLayout, childrenFrom, childrenTo);
        }

        @Override
        protected Cursor getChildrenCursor(Cursor groupCursor) {
            // 传进来一个组,返回一个对组内所有子组的cursor
            // 返回一个指向这个联系人电话的箭头
            Uri.Builder builder = People.CONTENT_URI.buildUpon();
            ContentUris.appendId(builder,
                    groupCursor.getLong(mGroupIdColumnIndex));
            builder.appendEncodedPath(People.Phones.CONTENT_DIRECTORY);
            Uri phoneNumberUri = builder.build();

            return managedQuery(phoneNumberUri, mPhoneNumberProjection, null,
                    null, null);

        }
    }
}

效果图

三、通过BaseExpandableListAdapter绑定数据

activity_main.xml

<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="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.explear.MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <ExpandableListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >
    </ExpandableListView>

</LinearLayout>

注意这里的ExpandableListView的id设置需要使用@android:id/list,否则会报

Your content must have a ExpandableListView whose id attribute is ‘android.R.id.list‘错误

package com.example.explear;

import android.R.anim;
import android.app.ExpandableListActivity;
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.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends ExpandableListActivity {
    private String[] groups = { "group1", "group2", "group3", "group4" };
    private String[][] children = {
            { "g1 item1", "g1 item2", "g1 item3", "g1 item4" },
            { "g2 item1", "g2 item2", "g2 item3", "g2 item4" },
            { "g3 item1", "g3 item2" }, { "g4 item1", "g4 item2" } };

    private ExpandableListView expandableListView;
    private TextView tView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tView = (TextView) findViewById(R.id.textView1);
        expandableListView = (ExpandableListView) findViewById(android.R.id.list);

        BaseExpandableListAdapter adapter = new BaseExpandableListAdapter() {

            @Override
            public boolean isChildSelectable(int groupPosition,
                    int childPosition) {
                String string = groups[groupPosition]
                        + children[groupPosition][childPosition];
                tView.setText(string);
                return true;
            }

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

            @Override
            public View getGroupView(int groupPosition, boolean isExpanded,
                    View convertView, ViewGroup parent) {
                LinearLayout layout = new LinearLayout(MainActivity.this);
                layout.setOrientation(0);
                layout.setPadding(50, 0, 0, 0);
                ImageView imageView = new ImageView(MainActivity.this);
                imageView.setImageResource(R.drawable.ic_launcher);
                layout.addView(imageView);

                TextView textView = getTextView();
                textView.setText(getGroup(groupPosition).toString());
                layout.addView(textView);
                return layout;
            }

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

            @Override
            public int getGroupCount() {
                return groups.length;
            }

            @Override
            public Object getGroup(int groupPosition) {
                return groups[groupPosition];
            }

            @Override
            public int getChildrenCount(int groupPosition) {
                return children[groupPosition].length;
            }

            @Override
            public View getChildView(int groupPosition, int childPosition,
                    boolean isLastChild, View convertView, ViewGroup parent) {
                TextView textView = getTextView();
                textView.setText(getChild(groupPosition, childPosition)
                        .toString());

                return textView;
            }

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

            @Override
            public Object getChild(int groupPosition, int childPosition) {
                return children[groupPosition][childPosition];
            }
        };
        expandableListView.setAdapter(adapter);
    }

    protected TextView getTextView() {
        AbsListView.LayoutParams lParams = new AbsListView.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, 64);
        TextView textView = new TextView(MainActivity.this);
        textView.setLayoutParams(lParams);
        textView.setPadding(20, 0, 0, 0);
        textView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
        return textView;
    }
}

效果图:

时间: 2024-08-04 11:32:53

Android ExpandableListView的使用的相关文章

Android ExpandableListView 带有Checkbox的简单应用

expandablelistview2_groups.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height=&qu

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

Android ExpandableListView实例Demo

前几篇文章介绍了Listview,但在实际开发中也经常会用到多层的Listview来展示数据,比如qq中的好友展示,所以这张来了解一下ExpandableListview,基本思想与Listview大致是相同的,所以用起来会比较方便. 实现效果图: 程序代码: 布局文件: activity_main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools

Android ExpandableListView和ScrollView联用的一些注意事项

之前有整理过ScrollView嵌套ListView的例子,讲的是计算listview的每一项的高度.已达到目标效果.同样的ExpandableListView嵌套ScrollView也是这么个思路,不过要稍微加一些方法和稍微做一些改动. 要实现这个功能首先要准备三个基础的方法: 一.计算ExpandableListView的group项的高度的方法(即计算listview合并时的高度的方法)备注:ExpandableListView是listview的子类所以,listview的方法它同样可以

Android:ExpandableListView使用

前言 目前回到了工作岗位,第一件事情就是ExpandListView的优化.这里简单的用一个Demo介绍一下ExpandableListView的使用. 简单介绍一下Demo实现的功能,主要是继承BaseExpandableListAdapter来自定义adapter呈现ExpandableListView数据: 每个child item有一个TextView和一个ImageView删除标识. 当点击一个child item,弹出Toast提示. child item可以通过点击删除图标来删除.

android ExpandableListView三级菜单的使用

由于本人所作的项目需要用到这种列表式的收缩与展开,因此,就好好研究了有关这方面的一些知识,当然,也借鉴了网上一些成功的案列.下面就是我模拟测试的一个展示界面. 实现上面的这些功能,我主要是通过ExpandableListView这一控件,以及BaseExpandableListAdapter适配器.这两者关联实现的.好的,那接下来,就对这些进行详细的展示. 所有的xml布局展示 ## activity_main.xml## <?xml version="1.0" encoding

Android ExpandableListView的技巧和问题

前言: 最近一个多月在认真的学习Android和做项目,文章内容表达的不好或者理解错了,希望大家评论指出. :-) 本文是总结几个比较常用且使用的技巧,和一个大家都会遇到的问题. 文章中大部分语句摘抄自一下两篇大神写的文章:(如果对ExpandableListView一无所知,建议按照顺序去阅读,遇到问题再看本文) 1.Android中ExpandableListView的使用 网址:http://blog.csdn.net/gyflyx/article/details/6461242 2.[A

android ExpandableListView详解

ExpandableListView是android中可以实现下拉list的一个控件,是一个垂直滚动的心事两个级别列表项手风琴试图,列表项是来自ExpandableListViewaAdapter,组可以单独展开. 重要方法: 1 expandGroup (int groupPos) ;//在分组列表视图中 展开一组, 2 setSelectedGroup (int groupPosition) ;//设置选择指定的组. 3 4 setSelectedChild (int groupPositi

【原创】Android ExpandableListView使用

ExpandableView的使用可以绑定到SimpleExpandableListAdapter,主要是看这个Adapter怎么用. 这个类默认的构造函数有9个参数, 很好地解释了什么叫做又臭又长. public SimpleExpandableListAdapter (Context context, List<? extends Map<String, ?>> groupData, int groupLayout, String[] groupFrom, int[] grou

Android ExpandableListView的下拉刷新实现

该控件的修改时根据PullToRefreshList的机制修改 下面是对ExpandableListView的扩展 package com.up91.gwy.view.componet; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import com.up91.gwy.R; import android.content.Context; import android.u