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. mysql根据某个字段分组根据更新时间获取最新的记录

    我现在有一种统计表,要根据一个字段分组然后根据更新时间,每个分组获取最新的一条记录.命名感觉挺简单的一个需求,然而没什么思路,当然是问度娘了. 度娘的答案很统一,然而都不管用,都是报错的,不知道是不是 ...

  2. (一)环境安装之Java

    一.安装JDK 点击 JDK8下载,根据自己的平台,选择相应的版本进行下载. Java环境分JDK和JRE ,JDK就是Java Development Kit. 简单的说JDK是面向开发人员使用的S ...

  3. 深入理解JavaScript系列(14):作用域链(Scope Chain)

    前言 在第12章关于变量对象的描述中,我们已经知道一个执行上下文 的数据(变量.函数声明和函数的形参)作为属性存储在变量对象中. 同时我们也知道变量对象在每次进入上下文时创建,并填入初始值,值的更新出 ...

  4. 1、操作表 ActionSheet

    /* --- page1.html ---*/ <ion-navbar *navbar> <ion-title>Tab 1</ion-title> </ion ...

  5. 05.File类的学习

    File  是文件的意思 File类是一个静态类,所以File类是一个工具类 File类是专门操作文件的类 File的常用方法 namespace _16.File类的学习 { class Progr ...

  6. [SQL SERVER系列]工作经常使用的SQL整理,实战篇(三)[原创]

    工作经常使用的SQL整理,实战篇,地址一览: 工作经常使用的SQL整理,实战篇(一) 工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实战篇(三) 接着本系列前面两篇继续讨论. 有时 ...

  7. c#解析json字符串处理(最清晰易懂的方法)

    注:博客迁移到csdn,本文最新地址:https://blog.csdn.net/sajiazaici/article/details/77647625 以下为原文 本文是全网第二简单的方法,因为我女 ...

  8. JS基础学习——作用域

    JS基础学习--作用域 什么是作用域 变量的作用域就是变量能被访问到的代码范围,比如在下面的这个js代码中,变量a的作用域就是函数foo,因此在全局作用域内的console.log(a)语句不能访问到 ...

  9. css一个很好用的hover显示

    之前一直想在样式实现,hover时显示其他div,今天终于找到了,(*^▽^*) .a悬停时显示.b .a:hover .b { display: block; }

  10. C语言入门(一)环境搭建

    1. 下载Code::Blocks(源文本编辑器) 2. 下载编译器MinGW(或者下载好自带编译器的codeblocks) http://jingyan.baidu.com/article/c843 ...