文档章节

ExpandableListView使用介绍

TedYin
 TedYin
发布于 2014/05/10 22:38
字数 1213
阅读 647
收藏 0
点赞 0
评论 0

本文翻译自:http://www.androidhive.info/2013/07/android-expandable-list-view-tutorial/


Expandable list view 是通过分类列表来组织数据的一种ListView。 在用户点击分组时他可以自动折叠或展开分组,如果你之前不熟悉ListView请先点击下面链了解一下ListView的基本用法 Android ListView Tutorial

下面我们开始学习ExpandableListView 如何使用。

1.创建一个新的工程,并且将main activity 命名为MainActivity.java

2.为了创建一个Expandable list view 视图,我们需要三个xml布局文件,第一个是main listview,第二个是ExpandableListView中的分类Iten使用的布局文件,第三个是展开后的列表的Item布局文件(ChildItem的布局文件)

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical"

    android:background="#f4f4f4" >

 

            <ExpandableListView

                android:id="@+id/lvExp"

                android:layout_height="match_parent"

                android:layout_width="match_parent"/>   

</LinearLayout>

3.创建第二个布局文件,作为Group Header(分类的Item)。我创建了一个叫 list_group.xml 的布局文件,如下所示

list_group.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:orientation="vertical"

    android:padding="8dp"

    android:background="#000000">

    <TextView

        android:id="@+id/lblListHeader"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"

        android:textSize="17dp"

        android:textColor="#f9f93d" />

</LinearLayout>

4.再创建一个布局文件,也就是展开列表时为其中的子Item提供布局的文件,我为他命名为 list_item.xml ,代码如下所示:

list_item.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="55dip"

    android:orientation="vertical" >

 

    <TextView

        android:id="@+id/lblListItem"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:textSize="17dip"

        android:paddingTop="5dp"

        android:paddingBottom="5dp"

        android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft" />

</LinearLayout>

5.我使用一个自定义的Adapter类去创建列表视图。创建一个新的类命名为ExpandableListAdapter.java 并且继承自BaseExpandableListAdapter这个类为创建ListView提供了许多基础的方法,其中getGroupView() –返回分组的Header视图

getChildView() – 返回分组展开后的列表视图

下面是自定义Adapter的代码:

ExpandableListAdapter.java

import java.util.HashMap;

import java.util.List;

 

import android.content.Context;

import android.graphics.Typeface;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseExpandableListAdapter;

import android.widget.TextView;

 

public class ExpandableListAdapter extends BaseExpandableListAdapter {

 

    private Context _context;

    private List<String> _listDataHeader; // header titles

    // child data in format of header title, child title

    private HashMap<String, List<String>> _listDataChild;

 

    public ExpandableListAdapter(Context context, List<String> listDataHeader,

            HashMap<String, List<String>> listChildData) {

        this._context = context;

        this._listDataHeader = listDataHeader;

        this._listDataChild = listChildData;

    }

 

    @Override

    public Object getChild(int groupPosition, int childPosititon) {

        return this._listDataChild.get(this._listDataHeader.get(groupPosition))

                .get(childPosititon);

    }

 

    @Override

    public long getChildId(int groupPosition, int childPosition) {

        return childPosition;

    }

 

    @Override

    public View getChildView(int groupPosition, final int childPosition,

            boolean isLastChild, View convertView, ViewGroup parent) {

 

        final String childText = (String) getChild(groupPosition, childPosition);

 

        if (convertView == null) {

            LayoutInflater infalInflater = (LayoutInflater) this._context

                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            convertView = infalInflater.inflate(R.layout.list_item, null);

        }

 

        TextView txtListChild = (TextView) convertView

                .findViewById(R.id.lblListItem);

 

        txtListChild.setText(childText);

        return convertView;

    }

 

    @Override

    public int getChildrenCount(int groupPosition) {

        return this._listDataChild.get(this._listDataHeader.get(groupPosition))

                .size();

    }

 

    @Override

    public Object getGroup(int groupPosition) {

        return this._listDataHeader.get(groupPosition);

    }

 

    @Override

    public int getGroupCount() {

        return this._listDataHeader.size();

    }

 

    @Override

    public long getGroupId(int groupPosition) {

        return groupPosition;

    }

 

    @Override

    public View getGroupView(int groupPosition, boolean isExpanded,

            View convertView, ViewGroup parent) {

        String headerTitle = (String) getGroup(groupPosition);

        if (convertView == null) {

            LayoutInflater infalInflater = (LayoutInflater) this._context

                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            convertView = infalInflater.inflate(R.layout.list_group, null);

        }

        TextView lblListHeader = (TextView) convertView

                .findViewById(R.id.lblListHeader);

        lblListHeader.setTypeface(null, Typeface.BOLD);

        lblListHeader.setText(headerTitle);

 

        return convertView;

    }

 

    @Override

    public boolean hasStableIds() {

        return false;

    } 

    @Override

    public boolean isChildSelectable(int groupPosition, int childPosition) {

        return true;

    }

}


6.当你完成了自定义Adapter以后,打开你的 MainActivity.java做如下操作,创建List view所需要的数据,并且将他们传递到Adapter中,来构建ExpandableListView,代码如下:

package info.androidhive.expandablelistview;

 

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.ExpandableListView;

import android.widget.ExpandableListView.OnChildClickListener;

import android.widget.ExpandableListView.OnGroupClickListener;

import android.widget.ExpandableListView.OnGroupCollapseListener;

import android.widget.ExpandableListView.OnGroupExpandListener;

import android.widget.Toast;

 

public class MainActivity extends Activity {

 

    ExpandableListAdapter listAdapter;

    ExpandableListView expListView;

    List<String> listDataHeader;

    HashMap<String, List<String>> listDataChild;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

 

        // get the listview

        expListView = (ExpandableListView) findViewById(R.id.lvExp);

 

        // preparing list data

        prepareListData();

 

        listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild);

 

        // setting list adapter

        expListView.setAdapter(listAdapter);

    }

 

    /*

     * Preparing the list data

     */

    private void prepareListData() {

        listDataHeader = new ArrayList<String>();

        listDataChild = new HashMap<String, List<String>>();

 

        // Adding child data

        listDataHeader.add("Top 250");

        listDataHeader.add("Now Showing");

        listDataHeader.add("Coming Soon..");

 

        // Adding child data

        List<String> top250 = new ArrayList<String>();

        top250.add("The Shawshank Redemption");

        top250.add("The Godfather");

        top250.add("The Godfather: Part II");

        top250.add("Pulp Fiction");

        top250.add("The Good, the Bad and the Ugly");

        top250.add("The Dark Knight");

        top250.add("12 Angry Men");

 

        List<String> nowShowing = new ArrayList<String>();

        nowShowing.add("The Conjuring");

        nowShowing.add("Despicable Me 2");

        nowShowing.add("Turbo");

        nowShowing.add("Grown Ups 2");

        nowShowing.add("Red 2");

        nowShowing.add("The Wolverine");

 

        List<String> comingSoon = new ArrayList<String>();

        comingSoon.add("2 Guns");

        comingSoon.add("The Smurfs 2");

        comingSoon.add("The Spectacular Now");

        comingSoon.add("The Canyons");

        comingSoon.add("Europa Report");

        listDataChild.put(listDataHeader.get(0), top250); // Header, Child data

        listDataChild.put(listDataHeader.get(1), nowShowing);

        listDataChild.put(listDataHeader.get(2), comingSoon);

    }

}

好了,以上工作都完成后,你就可以运行一下你的代码了。下来就会看到下面的样子:


ListVeiw 子 Item 点击事件监听

为了监听ListView 子 Item的点击事件可以通过实现setOnChildClickListener这个接口来完成,代码如下:

expListView.setOnChildClickListener( new OnChildClickListener() {
 
             @Override
             public boolean onChildClick(ExpandableListView parent, View v,
                     int groupPosition, int childPosition, long id) {
                 Toast.makeText(
                         getApplicationContext(),
                         listDataHeader.get(groupPosition)
                                 + " : "
                                 + listDataChild.get(
                                         listDataHeader.get(groupPosition)).get(
                                         childPosition), Toast.LENGTH_SHORT)
                         .show();
                 return false ;
             }

        });


列表展开事件监听

实现setOnGroupExpandListener监听,在列表项展开时,它将被触发并执行。


总结:ExpandableListView和ListView的用法差不多,它就相当于一个ListView的集合,每一个Item展开后又是一个ListView。因此他需要一个main.xml在这个里面声明ExpandableListView控件,然后需要一个ListItem(group header)来代表每个group Item ,然后需要一个xml来对展开后的子ListView的Item进行布局。

© 著作权归作者所有

共有 人打赏支持
TedYin
粉丝 1
博文 20
码字总数 10592
作品 0
深圳
程序员
android ExpandableListView ExpandableListAdapter使用

目前大家都在使用ExpandableListView完成一些特效,目前大多数程序在显示都没有问题,但是在处理数据的时候出现问题,本人使用自定义的显示模式及数据,单介绍这个空间的使用。 首先看主xml...

zhouhb1
2011/11/22
0
0
关于android中ExpandableListView控件的展开刷新问题

网上对listview控件的介绍很多,但是对ExpandableListView控件的介绍和示例还是不较少的,真正做项目开发时候才发现,可能ExpandableListView的使用会更频繁一些,毕竟大多数的时候,你所要用...

长平狐
2013/04/25
6.4K
0
Android expandablelistview数据绑定的问题

我使用runOnUiThread来执行异步任务AsyncTask,并在AsyncTask中更新expandablelistview,为什么expandablelistview只显示了一条getGroupView?点击它的时候没有调用getChildView,这是什么情...

kycp1
04/26
0
0
ExpandableListView和Listview可以共用一个写好的下拉刷新的工具类吗

以前我用的ListView加了下拉刷新,现在我改成了使用ExpandableListView,在他的基础上再加下拉刷新,我把关于Listview的都改成了ExpandableListView的 ,但是没效果,不知道是 ExpandableLi...

BAITOCC
2013/12/26
721
0
Android之微信朋友圈UI实现--ExpandableListView+GridView

PS:我们都知道微信,更是知道朋友圈,很多人在朋友圈里卖起了化妆品,打入广告等为自己做一下推广,里面会附带一写好看的图片,上面有标题,有描述,整体布局每场的美观,那么这是怎么实现的...

cmusketeer
07/16
0
0
expandablelistview学习--在listView里面嵌套GridView

在网上看到一个例子,讲android中的expandablelistview,是一种可以扩展的listview,就是那种点击一下可以扩展出子项,再点一下收缩回去的显示list。因为需要查看一堆文件的目录结构,就使用...

迷途d书童
2012/03/30
7.5K
0
ExpandableListView的用法

ExpandableListView组件是android中一个比较常用的组件,当点击一个父item的时候可以将它的子item显示出来,像手机QQ中的好友列表就是实现的类型效果。使用ExpandableListView组件的关键就是...

summerpxy
2014/03/04
48.5K
2
关于PullToRefreshExpandableListView适配器的问题

由于项目需要下拉刷新的效果,所以使用了开源控件PullToRefresh,并且用到了里面的多级列表PullToRefreshExpandableListView,但是在设置适配器的时候就遇到一个问题了,由于ExpandableListV...

无风也起浪
2015/10/10
3.7K
2
ListView,ExpandableListView等控件 元素过多导致其下方控件无法显示的解决

我在ExpandableListView下方放了一个TextView,但是当组全部展开,ExpandableListView的高度超过屏幕高度时,不管你怎么划屏幕,下面的TextView就是看不到,被隐藏了,ListView也有类似的问题,只要...

鉴客
2011/12/01
2.6K
0
Android的ListView和ExpandableListView使用的问题

最近开发一个android项目使用到ListView和ExpandableListView两个控件,如何能实现ListView中动态插入数据以及ExpandableListView的动态加载子数据集?...

路峰
2014/08/30
207
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

前端基础

1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是...

wenxingjun
21分钟前
0
0
Android 复制和粘贴功能

做了一回搬运工,原文地址:https://blog.csdn.net/kennethyo/article/details/76602765 Android 复制和粘贴功能,需要调用系统服务ClipboardManager来实现。 ClipboardManager mClipboardM...

她叫我小渝
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
6
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1
fiddler安装和基本使用以及代理设置

项目需求 由于开发过程中客户端和服务器数据交互非常频繁,有时候服务端需要知道客户端调用接口传了哪些参数过来,这个时候就需要一个工具可以监听这些接口请求参数,已经接口的响应的数据,这种...

银装素裹
今天
0
0
Python分析《我不是药神》豆瓣评论

读取 Mongo 中的短评数据,进行中文分词 对分词结果取 Top50 生成词云 生成词云效果 看来网上关于 我不是药神 vs 达拉斯 的争论很热啊。关于词频统计就这些,代码中也会完成一些其它的分析任...

猫咪编程
今天
0
0
虚拟机怎么安装vmware tools

https://blog.csdn.net/tjcwt2011/article/details/72638977

AndyZhouX
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部