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:不用关闭数据库,