• Android学习笔记_57_ExpandableListView控件应用


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

  • 相关阅读:
    状压DP
    题解:中位数
    题解:三只小猪
    二分图最大匹配
    AC自动机
    题解 P1137 【旅行计划】
    题解 P1280 【尼克的任务】
    DFT&IDFT学习笔记
    emacs配置
    莫比乌斯反演推导即μ函数的证明
  • 原文地址:https://www.cnblogs.com/lbangel/p/3581845.html
Copyright © 2020-2023  润新知