文档章节

ExpandableListView使用介绍

TedYin
 TedYin
发布于 2014/05/10 22:38
字数 1213
阅读 652
收藏 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
ExpandableListView和Listview可以共用一个写好的下拉刷新的工具类吗

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

BAITOCC
2013/12/26
721
0
Android expandablelistview数据绑定的问题

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

kycp1
04/26
0
0
Android之微信朋友圈UI实现--ExpandableListView+GridView

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

cmusketeer
07/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20.27 分发系统介绍~ 20.30 expect脚本传递参数

分发系统介绍分发系统-expect讲解(也就是一个分发的脚本)场景:业务越来越大,网站app,后端,编程语言是php,所以就需要配置lamp或者lnmp,最好还需要吧代码上传到服务器上;但是因...

洗香香
17分钟前
1
0
设计一个百万级的消息推送系统

前言 首先迟到的祝大家中秋快乐。 最近一周多没有更新了。其实我一直想憋一个大招,分享一些大家感兴趣的干货。 鉴于最近我个人的工作内容,于是利用这三天小长假憋了一个出来(其实是玩了两...

crossoverJie
23分钟前
1
0
软件架构:5种你应该知道的模式

Singleton(单例模式)、仓储模式(repository)、工厂模式(factory)、建造者模式(builder)、装饰模式(decorator)……大概每个上课听讲的程序员都不会陌生——软件的设计模式为我们提供...

好雨云帮
35分钟前
2
0
OSChina 周二乱弹 —— 这只是一笔金钱交易

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《暮春秋色》- 窦唯 / 译乐队 《暮春秋色》- 窦唯 / 译乐队 手机党少年们想听歌,请使劲儿戳(这里) @我没有抓狂:跨服聊...

小小编辑
46分钟前
405
14
df命令、du命令 、磁盘分区

9月25日任务 4.1 df命令 4.2 du命令 4.3/4.4 磁盘分区 4.1、命令 :df #磁盘空间使用情况 [root@zgxlinux-02 ~]# df 按字节显示 1000Byte=1KB 1000KB=1MB 1000MB=1GB ...

zgxlinux
54分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部