1、布局文件:

<?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="match_parent"
android:orientation="vertical" > <ExpandableListView
android:id="@+id/elv"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ExpandableListView>
</LinearLayout>

2、填充数据:与listview使用比较像

package cn.itcast.mobilesafe.ui;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream; import cn.itcast.mobilesafe.R;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView; public class CommonNumActivity extends Activity {
private ExpandableListView elv;
private BaseExpandableListAdapter adapter; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.common_num_query);
elv = (ExpandableListView) this.findViewById(R.id.elv); // 判断这个commonnum.db的数据库是否被放置到了sd卡上
// 如果不在sd卡上 要把db从asset目录拷贝到数据库
File file = new File("/sdcard/commonnum.db");
if (!file.exists()) {
copyfile();
} // listview 是怎么设置数据的?
// lv.setAdapter(); ->BaseAdapter
// elv.setAdapter ExpendAdapter ->BaseExpendAdapter elv.setAdapter(new MyAdapter());
} private class MyAdapter extends BaseExpandableListAdapter { // 返回有多少个分组
public int getGroupCount() {
int count=0;
SQLiteDatabase db = SQLiteDatabase.openDatabase("/sdcard/commonnum.db", null, SQLiteDatabase.OPEN_READONLY);
if(db.isOpen()){
Cursor cursor = db.rawQuery("select count(*) from classlist", null);
if(cursor.moveToFirst()){
count = cursor.getInt(0);
}
cursor.close();
db.close();
}
return count;
} // 返回某个分组对应的子孩子的条目个数 public int getChildrenCount(int groupPosition) { int count=0;
int tableindex = groupPosition+1;
String sql = "select count(*) from table"+tableindex; SQLiteDatabase db = SQLiteDatabase.openDatabase("/sdcard/commonnum.db", null, SQLiteDatabase.OPEN_READONLY);
if(db.isOpen()){
Cursor cursor = db.rawQuery(sql, null);
if(cursor.moveToFirst()){
count = cursor.getInt(0);
}
cursor.close();
db.close();
}
return count; } // 返回当前groupPosition 对应位置的对象
public Object getGroup(int groupPosition) {
return null;
} // 返回groupPosition第childPosition个子孩子对应的条目
public Object getChild(int groupPosition, int childPosition) {
return null;
} // 获取分组的id
public long getGroupId(int groupPosition) {
return groupPosition;
} // 获取分组中子孩子id
public long getChildId(int groupPosition, int childPosition) {
return 0;
}
// 是否允许子孩子有点击事件,默认子孩子没有点击事件
public boolean hasStableIds() {
return false;
} //获取组视图
@SuppressLint("SdCardPath")
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
TextView tv = new TextView(CommonNumActivity.this);
String text ="";
int currentpos = groupPosition+1;
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)){
SQLiteDatabase db = SQLiteDatabase.openDatabase("/sdcard/commonnum.db", null, SQLiteDatabase.OPEN_READONLY);
if(db.isOpen()){
Cursor cursor = db.rawQuery("select name from classlist where idx=?", new String[]{currentpos+""});
if(cursor.moveToFirst()){
text = cursor.getString(0);
}
cursor.close();
db.close();
}
tv.setText(" "+text);
}
return tv;
} //获取孩子视图
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
TextView tv = new TextView(CommonNumActivity.this);
StringBuilder sb = new StringBuilder();
int tableindex = groupPosition+1;
int childindex = childPosition+1;
String sql = "select number,name from table"+tableindex; SQLiteDatabase db = SQLiteDatabase.openDatabase("/sdcard/commonnum.db", null, SQLiteDatabase.OPEN_READONLY);
if(db.isOpen()){
Cursor cursor = db.rawQuery(sql+ " where _id=?", new String[]{childindex+""});
if(cursor.moveToFirst()){
sb.append( cursor.getString(0)); //number
sb.append(":");
sb.append( cursor.getString(1)); //name }
cursor.close();
db.close();
}
String text = sb.toString();
tv.setText(text);
return tv;
} public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
} }
private void copyfile() {
AssetManager manager = getAssets();
try {
InputStream is = manager.open("commonnum.db");
File file = new File("/sdcard/commonnum.db");
FileOutputStream fos = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fos.flush();
fos.close(); } catch (IOException e) {
e.printStackTrace();
}
} }

3、如何优化:

  A:考虑重用convertView

  B:不用关闭数据库,

Android学习笔记_57_ExpandableListView控件应用的更多相关文章

  1. [Android学习笔记]组合控件的使用

    组合控件的使用 开发过程中,多个UI控件需要协同工作,相互交互之后,才可完成一个完整的业务需求,此时可把这些控件封装成为一个整体,相互之间的交互逻辑封装其中,外部调用可无需关心内部逻辑,只需获取处理后 ...

  2. Android学习笔记_11_ListView控件使用

    一.界面设计: 1.activity_main.xml文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk ...

  3. android学习笔记七——控件(DatePicker、TimePicker、ProgressBar)

    DatePicker.TimePicker ==> DatePicker,用于选择日期 TimePicker,用于选择时间 两者均派生与FrameLayout,两者在FrameLayout的基础 ...

  4. 十三、Android学习笔记_Andorid控件样式汇总

    <!-- 设置activity为透明 --> <style name="translucent"> <item name="android: ...

  5. Android学习笔记_75_Andorid控件样式汇总

    <!-- 设置activity为透明 --> <style name="translucent"> <item name="android: ...

  6. android菜鸟学习笔记12----Android控件(一) 几个常用的简单控件

    主要参考<第一行代码> 1.TextView: 功能与传统的桌面应用开发中的Label控件相似,用于显示文本信息 如: <TextView android:layout_width= ...

  7. android菜鸟学习笔记14----Android控件(三) ListView的简单使用

    MVC模式: MVC的基本原理就是通过Controller连接View和Model.当View中所显示的数据发生变化时,会通知Controller,然后由Controller调用Model中的相关方法 ...

  8. android菜鸟学习笔记13----Android控件(二) 自定义控件简单示例

    有时候,可能觉得系统提供的控件太丑,就会需要自定义控件来实现自己想要的效果. 以下主要参考<第一行代码> 1.自定义一个标题栏: 系统自带的标题栏很丑,且没什么大的作用,所以我们之前会在o ...

  9. iOS学习笔记——基础控件(上)

    本篇简单罗列一下一些常用的UI控件以及它们特有的属性,事件等等.由于是笔记,相比起来不会太详细 UIView 所有UI控件都继承于这个UIView,它所拥有的属性必是所有控件都拥有,这些属性都是控件最 ...

随机推荐

  1. Javascript模块化编程详解

    在这篇文章中,我将会回顾一下js模块化编程的基础,并且将会讲到一些真的非常值得一提的进阶话题,包括一个我认为是我自创的模式. 模块化编程是一种非常常见Javascript编程模式.它一般来说可以使得代 ...

  2. SQL更新派工单数量=任务数量的

    select b.FCommitQty '任务数量',a.FQty '派工数量',a.FSourceBillNo '派工单号',b.FBillNo '任务单号',a.FStatus '派工状态' fr ...

  3. ThenJS

    安装ThenJs:  npm i thenjs 史上最快,与 node callback 完美结合的异步流程控制库 <!doctype html> <html lang=" ...

  4. 重写Euqals & HashCode

    package com.test.collection; import java.util.HashMap; import java.util.Map; /** * 重写equals & ha ...

  5. 文章点赞功能(Ajax)

    一.文章点赞样式构建 1.将base.html的css样式改为外部引入 将base.html的内嵌样式删除,改为使用 HTML 头部的 <head> 标签对中使用<link>标 ...

  6. css随堂笔记(三)

    Css随堂笔记(三) 1 关于背景图片   A 设置背景图片:background-image:url(“图片的路径”):   B 背景图片位置: background-position:1 方位名词 ...

  7. socket programming

  8. centos 7使用yum安装docker容器

    使用yum命令即可安装 yum install docker 安装完成后,使用下面的命令来启动 docker 服务,并将其设置为开机启动: [root@localhost ~]# systemctl ...

  9. CentOS7 查询已安装的包方便整理 /卸载

    以PHP为例.首先查看已安装的PHP rpm -qa |grep php 输出结果: php-cli--.el7.x86_64 php-common--.el7.x86_64 查询rpm包的安装时间和 ...

  10. 字符串相关函数-strcpy()与strcmp()

    一些小问题,避免出现低级错误. 1.strcmp(s1,s2): 字符串指针不见'\0'不回头,这个常在与单个字符作比较时写着写着就忘了. char* p_ch1="this is an e ...