1.简介

  基于基于BaseExpandableListAdapter扩展的ExpandableList用法,现在网上流行的主要有两种:第一种是向BaseExpandableListAdapter传入两个数组,第一个是表示Group(目录头)信息的一维数组,第二个是表示Child(目录子项)的二维数组数组;第二种是构建两个类,一个是表示目录信息的GroupInfo类,另一个是表示子项信息的ChildInfo类,然后传入BaseExpandableListAdapter。通过对比发现,第一种方法由于数组是固定的,而实际项目中往往需要动态变化的目录和子项,因此用处不大,第二种方法文件太多,实现复杂。这里提供一种方法,传递两个个动态的二维数组来实现目录结构。

2.案例

package com.devin;

import java.util.ArrayList;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; public class PadTestActivity extends Activity { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
      
ArrayList<String> groupList = new ArrayList<String>();
for (int i = 0; i < 3; i++) {
groupList.add("title");
} ArrayList<String> itemList1 = new ArrayList<String>();
itemList1.add("Item1");
itemList1.add("Item2");
ArrayList<String> itemList2 = new ArrayList<String>();
itemList2.add("Item1");
itemList2.add("Item21");
itemList2.add("Item3");
ArrayList<String> itemList3 = new ArrayList<String>();
itemList3.add("Item1");
itemList3.add("Item2");
itemList3.add("Item3");
itemList3.add("Item4");
ArrayList<ArrayList<String>> childList = new ArrayList<ArrayList<String>>();
childList.add(itemList1);
childList.add(itemList2);
childList.add(itemList3); ExpandableListView list = new ExpandableListView(this);
ExpandableListAdapter mAdapter = new MyExpandableListAdapter(groupList, childList);
list.setAdapter(mAdapter); list.setCacheColorHint(0x00000000);
list.setSelector(new ColorDrawable(Color.TRANSPARENT));
list.setGroupIndicator(null);
for (int i = 0; i < mAdapter.getGroupCount(); i++) {
list.expandGroup(i);
} setContentView(list);
} private class MyExpandableListAdapter extends BaseExpandableListAdapter {
private ArrayList<String> groupList;
private ArrayList<ArrayList<String>> childList; MyExpandableListAdapter(ArrayList<String> groupList, ArrayList<ArrayList<String>> childList) {
this.groupList = groupList;
this.childList = childList;
} public Object getChild(int groupPosition, int childPosition) {
return childList.get(groupPosition).get(childPosition);
} private int selectedGroupPosition = -1;
private int selectedChildPosition = -1; public void setSelectedPosition(int selectedGroupPosition, int selectedChildPosition) {
this.selectedGroupPosition = selectedGroupPosition;
this.selectedChildPosition = selectedChildPosition;
} public long getChildId(int groupPosition, int childPosition) {
return childPosition;
} public int getChildrenCount(int groupPosition) {
return childList.get(groupPosition).size();
} public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
TextView textView = null;
if (convertView == null) {
textView = new TextView(PadTestActivity.this);
textView.setPadding(32, 10, 0, 10);
convertView = textView;
} else {
textView = (TextView) convertView;
} textView.setText(getChild(groupPosition, childPosition).toString()); if (groupPosition == selectedGroupPosition) {
if (childPosition == selectedChildPosition) {
textView.setBackgroundColor(0xffb6ddee);
} else {
textView.setBackgroundColor(Color.TRANSPARENT);
}
} textView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
setSelectedPosition(groupPosition, childPosition);
notifyDataSetChanged();
}
});
return textView;
} public Object getGroup(int groupPosition) {
return groupList.get(groupPosition);
} public int getGroupCount() {
return groupList.size();
} public long getGroupId(int groupPosition) {
return groupPosition;
} public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
LinearLayout cotain = new LinearLayout(PadTestActivity.this);
cotain.setPadding(0, 10, 0, 10);
cotain.setGravity(Gravity.CENTER_VERTICAL); ImageView imgIndicator = new ImageView(PadTestActivity.this);
TextView textView = new TextView(PadTestActivity.this);
textView.setText(getGroup(groupPosition).toString());
textView.setPadding(5, 0, 0, 0); if (isExpanded) {
imgIndicator.setBackgroundResource(R.drawable.macro_minus);
} else {
imgIndicator.setBackgroundResource(R.drawable.macro_plus);
}
cotain.addView(imgIndicator);
cotain.addView(textView);
return cotain;
} public boolean hasStableIds() {
return true;
} public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
}

上述代码中,过向BaseExpandableListAdapter传递两个动态数组groupList(表示目录头信息)和childList (表示子项信息)来构建目录,一方面能够实现动态的添加数据,另一方面简化了实现,一举两得。另外,重写的BaseExpandableListAdapter,如果应用在实际项目中,需要对getGroupView()和getChildView()方法进行构建缓存(和ListView构建一样),以便优化性能和防止内存泄漏。需要的朋友可以自己构建。

Android之ExpandableList扩展用法(基于BaseExpandableListAdapter)的更多相关文章

  1. Android 实现QQ扩展listview(expandlistview)

    Android 实现QQ扩展listview(expandlistview) <?xml version="1.0" encoding="utf-8"?& ...

  2. android的logcat详细用法

    Android日志系统提供了记录和查看系统调试信息的功能.日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命 令来查看和使用. 使用logcat命令 你可以用 logc ...

  3. android的四层体系结构,基于mvc三层结构浅析

    从多方面理解Android体系结构 1.以分层的方式来看Android 安卓体系结构分为四层. 首先看一下官方关于Android体系结构的图: 1).Linux Kernel:负责硬件的驱动程序.网络 ...

  4. 怎么通过activity里面的一个按钮跳转到另一个fragment(android FragmentTransaction.replace的用法介绍)

    即:android FragmentTransaction.replace的用法介绍 Fragment的生命周期和它的宿主Activity密切相关,几乎和宿主Activity的生命周期一致,他们之间最 ...

  5. Android开发中Bundle用法包裹数据(转)

    Android开发中Bundle用法包裹数据 Bundle的经典用法,包裹数据放入Intent中,目的在于传输数据. SDK 里是这样描述: A mapping from String values ...

  6. 【转】Android各种Adapter的用法

    转自:http://my.oschina.net/u/658933/blog/372151 Android各种Adapter的用法 发表于5个月前(2015-01-27 10:56)   阅读(143 ...

  7. 高扩展的基于NIO的服务器架构(二)

    接上文高扩展的基于NIO的服务器架构 Reactor模式 如下图所示,将不同事件的检测分离开,当一种事件发生时一个事件处理器EventHandler将通知与该事件处理相对应的专用工作线程 采用这种架构 ...

  8. 高扩展的基于NIO的服务器架构

    当你考虑写一个扩展性良好的基于Java的服务器时,相信你会毫不犹豫地使用Java的NIO包.为了确保你的服务器能够健壮.稳定地运行,你可能会花大量的时间阅读博客和教程来了解线程同步的NIO selec ...

  9. android application类的用法

    android application类的用法 Application是android系统Framework提供的一个组件,它是单例模式(singleton),即每个应用只有一个实例,用来存储系统的一 ...

随机推荐

  1. ios NavigationViewController跳转以及返回传值

    (一)使用NavigationViewController进行页面跳转时,应该使用pushViewController方法来跳转至下一页面.这种话.下一页面相同在NavigationViewContr ...

  2. 【BZOJ4028】[HEOI2015]公约数数列 分块

    [BZOJ4028][HEOI2015]公约数数列 Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. M ...

  3. POJ 1694 An Old Stone Game【递归+排序】

    链接: http://poj.org/problem?id=1694 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=27454#probl ...

  4. The hidden layers are either convolutional, pooling or fully connected.

    https://en.wikipedia.org/wiki/Convolutional_neural_network Convolutional layers apply a convolution ...

  5. Qt状态机框架(状态机就开始异步的运行了,也就是说,它成为了我们应用程序事件循环的一部分了)

    状态机框架 Qt中的状态机框架为我们提供了很多的API和类,使我们能更容易的在自己的应用程序中集成状态动画.这个框架是和Qt的元对象系统机密结合在一起的.比如,各个状态之间的转换是通过信号触发的,状态 ...

  6. SAP ATP邏輯可用性檢查

    [转http://tqmeng.blog.163.com/blog/static/169263916201162002414612/]SAP ATP邏輯可用性檢查1.可用性檢查群組OVZ2主要用於檢查 ...

  7. linux 8 -- 管道组合Shell命令进行系统管理

    二十. 通过管道组合Shell命令获取系统运行数据: 1.  输出当前系统中占用内存最多的5条命令:     #1) 通过ps命令列出当前主机正在运行的所有进程.     #2) 按照第五个字段基于数 ...

  8. 阿里云修改centos7主机名

    为了玩Docker,买个阿里云主机也是够拼的了. [root@iZ284olvkmjZ ~]# 不过主机名中怎么好DT,无奈,修改. 我们需要的是永久生效,阿里云提供了两种方法: 方法(1). 输入h ...

  9. FOXMAIL提示容量满无法收邮件,清除旧邮件后还是无法收取,请问如何解决?

    FOXMAIL提示容量满无法收邮件,清除旧邮件后还是无法收取,请问如何解决? 2009-03-23 11:21包子燕  分类:网站使用 我清除了FOXMAIL所在的磁盘空间,共有12G,也删除了部分旧 ...

  10. 小程序 requestAnimationFrame 死循环

    小程序没有requestAnimationFrame  这个方法,小游戏有,使用这个方法会造成死循环