文档章节

android ExpandableListView详解

a
 amigos_wu
发布于 2012/06/17 14:16
字数 1752
阅读 101510
收藏 57
点赞 10
评论 15

ExpandableListView是android中可以实现下拉list的一个控件,是一个垂直滚动的心事两个级别列表项手风琴试图,列表项是来自ExpandableListViewaAdapter,组可以单独展开。

重要方法:

expandGroup (int groupPos) ;//在分组列表视图中 展开一组,
setSelectedGroup (int groupPosition) ;//设置选择指定的组。

setSelectedChild (int groupPosition, int childPosition, boolean shouldExpandGroup);//设置选择指定的子项。

getPackedPositionGroup (long packedPosition);//返回所选择的组

getPackedPositionForChild (int groupPosition, int childPosition) ;//返回所选择的子项

getPackedPositionType (long packedPosition);//返回所选择项的类型(Child,Group)

isGroupExpanded (int groupPosition);//判断此组是否展开

 expandableListView.setDivider();这个是设定每个Group之间的分割线。

  expandableListView.setGroupIndicator();这个是设定每个Group之前的那个图标。

  expandableListView.collapseGroup(int group); 将第group组收起

ExpandableListAdapter

一个接口,将基础数据链接到一个ExpandableListView。 此接口的实施将提供访问Child的数据(由组分类),并实例化的Child和Group。

1.重要方法

    getChildId (int groupPosition, int childPosition) 获取与在给定组给予孩子相关的数据。

    getChildrenCount (int groupPosition) 返回在指定Group的Child数目。

案例:

首先定义个一个布局文件expandablelistview.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" >
     <ExpandableListView 
        android:id ="@+id/expandableListView"   
	    android:layout_width ="fill_parent"   
	    android:layout_height ="wrap_content"   
        >
     </ExpandableListView>
</LinearLayout>

 

 

package com.test;

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

import javax.security.auth.PrivateCredentialPermission;

import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;

public class ExpandableListViewDemo extends Activity {
    /** Called when the activity is first created. */
	
	//定义两个List用来控制Group和Child中的String;
	
	private  List<String>  groupArray;//组列表
	private  List<List<String>> childArray;//子列表
	private  ExpandableListView  expandableListView_one;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        requestWindowFeature(Window.FEATURE_NO_TITLE);  //设置为无标题  
        setContentView(R.layout.expandablelistview);
        expandableListView_one =(ExpandableListView)findViewById(R.id.expandableListView);
        groupArray =new ArrayList<String>();
        childArray = new ArrayList<List<String>>();
       
        /*-第一季-*/
        initdate();
        expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));
        
        /*-第二季-*/
//        groupArray.add("移动开发");
//        List<String> arrayList = new ArrayList<String>();
//        arrayList.add("Android");
//        arrayList.add("IOS");
//        arrayList.add("Windows Phone");
//        //组循环
//        for(int index=0;index<groupArray.size();++index)
//        {
//        	childArray.add(arrayList);
//        }
//        expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));
        
    }
    class ExpandableListViewaAdapter extends BaseExpandableListAdapter {
    	Activity activity;
    	 public  ExpandableListViewaAdapter(Activity a)  
    	    {  
    	        activity = a;  
    	    }  
       /*-----------------Child */
    	@Override
    	public Object getChild(int groupPosition, int childPosition) {
    		// TODO Auto-generated method stub
    		return childArray.get(groupPosition).get(childPosition);
    	}

    	@Override
    	public long getChildId(int groupPosition, int childPosition) {
    		// TODO Auto-generated method stub
    		return childPosition;
    	}

    	@Override
    	public View getChildView(int groupPosition, int childPosition,
    			boolean isLastChild, View convertView, ViewGroup parent) {
    		
    		String string =childArray.get(groupPosition).get(childPosition);
    		
    		return getGenericView(string);
    	}

    	@Override
    	public int getChildrenCount(int groupPosition) {
    		// TODO Auto-generated method stub
    		return childArray.get(groupPosition).size();
    	}
       /* ----------------------------Group */
    	@Override
    	public Object getGroup(int groupPosition) {
    		// TODO Auto-generated method stub
    		return getGroup(groupPosition);
    	}

    	@Override
    	public int getGroupCount() {
    		// TODO Auto-generated method stub
    		return groupArray.size();
    	}

    	@Override
    	public long getGroupId(int groupPosition) {
    		// TODO Auto-generated method stub
    		return groupPosition;
    	}

    	@Override
    	public View getGroupView(int groupPosition, boolean isExpanded,
    			View convertView, ViewGroup parent) {
    		
           String   string=groupArray.get(groupPosition);
           return getGenericView(string);
    	}

    	@Override
    	public boolean hasStableIds() {
    		// TODO Auto-generated method stub
    		return false;
    	}

    	@Override
    	public boolean isChildSelectable(int groupPosition, int childPosition) 
    	{
    		// TODO Auto-generated method stub
    		return true;
    	}
    	
    	private TextView  getGenericView(String string ) 
    	{
              AbsListView.LayoutParams  layoutParams =new AbsListView.LayoutParams(
    				ViewGroup.LayoutParams.MATCH_PARENT,
    				ViewGroup.LayoutParams.WRAP_CONTENT);
              
              TextView  textView =new TextView(activity);
              textView.setLayoutParams(layoutParams);
              
              textView.setGravity(Gravity.CENTER_VERTICAL |Gravity.LEFT);
              
              textView.setPadding(40, 0, 0, 0);
              textView.setText(string);
              return textView;
         }
    }
    
    private void initdate() 
    {
    	addInfo("语言", new String[]{"Oracle","Java","Linux","Jquery"});
    	addInfo("男人的需求", new String[]{"金钱","事业","权力","女人","房子","车","球"});
    }
    private void addInfo(String group,String []child) {
		
    	groupArray.add(group);
    	
    	List<String>  childItem =new ArrayList<String>();
    	
    	for(int index=0;index<child.length;index++)
    	{
    		childItem.add(child[index]);
    	}
         childArray.add(childItem);
	}
}

运行效果:

注释修改如下代码:

/*-第一季-*/
//        initdate();
//        expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));
        
        /*-第二季-*/
        groupArray.add("移动开发");
        List<String> arrayList = new ArrayList<String>();
        arrayList.add("Android");
        arrayList.add("IOS");
        arrayList.add("Windows Phone");
        //组循环
        for(int index=0;index<groupArray.size();++index)
        {
        	childArray.add(arrayList);
        }
        expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));

 运行效果:

★★★★★★★★★★★★★★★★★★★★

案例二:

1.定义一个主界面expandablelistview.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" >
     <ExpandableListView 
        android:id ="@+id/expandableListView"   
	    android:layout_width ="fill_parent"   
	    android:layout_height ="wrap_content"   
        >
     </ExpandableListView>
</LinearLayout>

2.在res/drawable目录下创建样式文件expandablelistview_groups.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" >
     <TextView 
        android:id="@+id/textGroup"   
        android:layout_width="fill_parent"   
        android:layout_height="fill_parent"   
        android:paddingLeft="40px"   
        android:paddingTop="6px"   
        android:paddingBottom="6px"   
        android:textSize="15sp"   
        android:text="No data"   
    >   
    </TextView>
</LinearLayout>

3.在res/drawable目录下创建样式文件expandablelistview_child.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" >
     <TextView     
        android:id="@+id/textChild"   
        android:layout_width="fill_parent"    
        android:layout_height="fill_parent"    
        android:paddingLeft="60px"   
        android:paddingTop="10px"   
        android:paddingBottom="10px"   
        android:textSize="20sp"   
        android:text="No Data" />  
</LinearLayout>

定义java文件:ExpandableListViewDemo_two.java

 

package com.test;

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

import javax.security.auth.PrivateCredentialPermission;

import com.test.R;
import com.test.ExpandableListViewDemo.ExpandableListViewaAdapter;
import com.test.R.id;
import com.test.R.layout;

import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.SimpleExpandableListAdapter;
import android.widget.TextView;

public class ExpandableListViewDemo_two extends Activity {
	/** Called when the activity is first created. */   
	private  ExpandableListView  expandableListView_one;
    @Override   
    public void onCreate(Bundle savedInstanceState)   
    {   
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.expandablelistview);   
        expandableListView_one =(ExpandableListView)findViewById(R.id.expandableListView);   
        //创建二个一级条目标题    
        Map<String, String> title_1 = new HashMap<String, String>();   
        Map<String, String> title_2 = new HashMap<String, String>();   
           
        title_1.put("group", "移动开发");   
        title_2.put("group", "男人的需求");   
           
        //创建一级条目容器    
        List<Map<String, String>> gruops = new ArrayList<Map<String,String>>();   
           
        gruops.add(title_1);   
        gruops.add(title_2);   
           
        //创建二级条目内容    
           
        //内容一    
        Map<String, String> content_1 = new HashMap<String, String>();   
        Map<String, String> content_2 = new HashMap<String, String>();   
           
        content_1.put("child", "ANDROID");   
        content_2.put("child", "IOS");   
           
        List<Map<String, String>> childs_1 = new ArrayList<Map<String,String>>();   
        childs_1.add(content_1);   
        childs_1.add(content_2);   
           
        //内容二    
        Map<String, String> content_3 = new HashMap<String, String>();   
        Map<String, String> content_4 = new HashMap<String, String>();  
        Map<String, String> content_5 = new HashMap<String, String>(); 
           
        content_3.put("child", "金钱");   
        content_4.put("child", "权力");   
        content_5.put("child", "女人"); 
        List<Map<String, String>> childs_2 = new ArrayList<Map<String,String>>();   
        childs_2.add(content_3);   
        childs_2.add(content_4);  
        childs_2.add(content_5); 
           
        //存放两个内容, 以便显示在列表中    
        List<List<Map<String, String>>> childs = new ArrayList<List<Map<String,String>>>();   
        childs.add(childs_1);   
        childs.add(childs_2);   
           
        //创建ExpandableList的Adapter容器    
/**  
* 使用SimpleExpandableListAdapter显示ExpandableListView  
* 参数1.上下文对象Context  
* 参数2.一级条目目录集合  
* 参数3.一级条目对应的布局文件 (expandablelistview_groups.xml文件 
* 参数4.fromto,就是map中的key,指定要显示的对象  
* 参数5.与参数4对应,指定要显示在groups中的id  
* 参数6.二级条目目录集合  
* 参数7.二级条目对应的布局文件  
* 参数9.与参数8对应,指定要显示在childs中的id  
/           SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(   
                this, gruops, R.drawable.expandablelistview_groups, new String[]{"group"}, new int[]{R.id.textGroup},    
                childs, R.drawable.expandablelistview_child, new String[]{"child"}, new int[]{R.id.textChild}   
                );   
           
        //加入列表    
        expandableListView_one.setAdapter(adapter); 
     expandableListView_one.setOnChildClickListener(listener);
    }   
    private OnChildClickListener  listener =new OnChildClickListener() {
   @Override
  public boolean onChildClick(ExpandableListView parent, View v,
    int groupPosition, int childPosition, long id) {
   // TODO Auto-generated method stub
   toast("点击了");
   return false;
  }
 };
 private void toast(String str) {
 Toast.makeText(this, str, Toast.LENGTH_LONG).show(); 
 } 
}

 上面的样式也可以使用系统的自带的样式如下:

android.R.layout.simple_expandable_list_item_1,//层显示样式 ,系统自定义  

android.R.layout.simple_expandable_list_item_2,  

运行效果:

案例三:如果group中有个ImageVIew将会是什么情况呢?

在SimpleExpandableListAdapter中有如下方法:

private void bindView(View view, Map<String, ?> data, String[] from, int[] to) {
        int len = to.length;

        for (int i = 0; i < len; i++) {
            TextView v = (TextView)view.findViewById(to[i]);
            if (v != null) {
                v.setText((String)data.get(from[i]));
            }
        }
    }

从上面的方法中可以看出 SimpleExpandableListAdapter把所以的View都当成TextView来处理了,而不像SimpleAdapter可以自动判断View的类型,自动绑定,解决版本就是重写bingview回调一下试试:

 

public class MyExpandableListAdapter extends BaseExpandableListAdapter{
        private void bindView(View view, Map<String, ?> data, String[] from, int[] to) {
                int len = to.length;
                boolean isBound = false;
                for (int i = 0; i < len; i++) {
                   final View v = view.findViewById(to[i]);
                 if (v!=null) {
                final Object _data = data.get(from[i]);
                String text = _data == null ? "" : data.toString();
                if (text == null) {
                    text = "";
                }
                          if (mViewBinder != null) {//如果Binder不为空,使用Binder进行处理
                                        isBound = mViewBinder.setViewValue(v, data.get(from[i]), text);
                                }
                                if (!isBound) {//如果Binder跳过,使用原来的方法进行处理
                                        TextView _v = (TextView)v;
                                        _v.setText((String)data.get(from[i]));
                                }                               
                        }
                }
        }
}

 

 

 

© 著作权归作者所有

共有 人打赏支持
a
粉丝 35
博文 81
码字总数 61744
作品 0
合肥
程序员
加载中

评论(15)

北极心
北极心
你好!问一下,怎么只更新里面的数据呢? 里面的数据是后台来的,我启了个定时器去请求随时都在变!
xiaoshu666
xiaoshu666
楼主如果,在子列表中加入ListView时候有滚动条,而负级也有滚动条的时候。子列表内滚动条不触发要怎么解决啊???
陈飞鸽
陈飞鸽
安卓的应该是JAVA语言。
xys430381
xys430381
最后一段代码中mViewBinder是什么变量?要怎么产生?我正在写一个代码,需要在扩展列表中用到图片和文字,想要用重写bindView。我试验了一下,ExpandableListView和SimpleExpandableListView类里都没有mViewBinder这个成员变量,也没有setViewBinder( )和getViewBinder( )方法。
求指点!
李iris
李iris
如果不确定ExpandableListView中的子列表数,该怎么做呢?
tengweifeng
tengweifeng
index<groupArray.size() 这个地方也不对,这样写只能显示一个Android
tengweifeng
tengweifeng
楼主第一个例子太乱,两个Array都没有初始化
tengweifeng
tengweifeng

引用来自“BigBoss”的评论

感觉 第 90 行 的 return getGroup(groupPosition);
应该改成 return groupArray.get(groupPosition);

正解!
box_robot
box_robot
感谢楼主分享。如果楼主贡献代码,让我们直接运行看效果就更好了13
Android RxJava: 这是一份全面的 操作符 使用汇总 (含详细实例讲解)

前言 ,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 开发者的欢迎。 如果还不了解RxJava,请看文章:Android:这是一篇 清晰 & 易懂的Rxjava 入门教程 如此受欢迎的原...

Carson_Ho ⋅ 05/31 ⋅ 0

AndroidManifest.xml详解

我们在进行APP开发的时候都会遇到一个文件:AndroidManifest.xml。从刚开始进行Android开发,到现在已经过去了几个月,还是对这个文件一知半解,只知道它是配置用的。但是这文件里的东西具体...

闪电的蓝熊猫 ⋅ 05/14 ⋅ 0

Android Hybrid开发:这是一份详细 & 全面的WebView学习攻略

前言 现在很多里都内置了Web网页(),比如说很多电商平台,淘宝、京东、聚划算等等,如下图 那么这种该如何实现呢?其实这是里一个叫组件实现 今天,我将献上一份全面 & 详细的 攻略,含具体...

Carson_Ho ⋅ 前天 ⋅ 0

Canvas/Shader- Android

Shader的五个子类:BitmapShader、LinearGradient、RadialGradient、SweepGradient和ComposeShader。 Android中Canvas绘图之Shader使用图文详解- https://blog.csdn.net/iispring/article/de......

shareus ⋅ 05/15 ⋅ 0

Android动画:献上一份详细 & 全面的动画知识学习攻略

前言 动画的使用 是 开发中常用的知识 可是动画的种类繁多、使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策 本文将献上一份动画的全面介绍攻略,包括动...

Carson_Ho ⋅ 06/06 ⋅ 0

Android 性能优化:手把手教你优化Bitmap图片资源的使用

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的Bitmap 使用优化,希望你们会喜欢 目录 1. 优化原因 即 为什么要优化图片资源,具体如下图:

Carson_Ho ⋅ 04/24 ⋅ 0

Android:手把手教你学会使用Google出品的序列化神器Protocol Buffer

前言 习惯用 数据存储格式的你们,相信大多都没听过 其实 是 出品的一种轻量 & 高效的结构化数据存储格式,性能比 真的强!太!多! 由于 出品,我相信已经具备足够的吸引力 今天,我将详细介...

Carson_Ho ⋅ 04/16 ⋅ 0

Android WebView:这是一份 详细 & 易懂的WebView学习攻略(含与JS交互、缓存构建等)

前言 现在很多里都内置了Web网页(),比如说很多电商平台,淘宝、京东、聚划算等等,如下图 那么这种该如何实现呢?其实这是里一个叫组件实现 今天,我将献上一份全面 & 详细的 攻略,含具体...

Carson_Ho ⋅ 05/21 ⋅ 0

Android WebView:这是一份全面 & 详细的WebView学习指南

前言 现在很多里都内置了Web网页(),比如说很多电商平台,淘宝、京东、聚划算等等,如下图 那么这种该如何实现呢?其实这是里一个叫组件实现 今天,我将献上一份全面 & 详细的 攻略,含具体...

carson_ho ⋅ 04/19 ⋅ 0

Android开发权威指南(第2版)新书发布

《Android开发权威指南(第二版)》是畅销书《Android开发权威指南》的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45章精彩内容供读者学习。  《Android开发权威指...

androidguy ⋅ 2013/09/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

浅谈springboot Web模式下的线程安全问题

我们在@RestController下,一般都是@AutoWired一些Service,由于这些Service都是单例,所以并不存在线程安全问题。 由于Controller本身是单例模式 (非线程安全的), 这意味着每个request过来,...

算法之名 ⋅ 53分钟前 ⋅ 0

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部