[mobilesafe] 08_可扩展的ExpandableListView——常用号码查询

Android 4.0

可扩展的ExpandableListView

常用号码查询步骤:
1、从assets拷贝数据库到系统目录commonnum.db
2、编写dao访问数据库CommonNumberDao.java
package cn.zengfansheng.mobilesafe.db.dao;
 
import android.annotation.SuppressLint;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
/**
* 2、常见号码查询Dao
* @author hacket
*
*/

public class CommonNumberDao {
 
    @SuppressLint("SdCardPath")
    private static final String PATH = "/data/data/cn.zengfansheng.mobilesafe/files/commonnum.db";
    private static final String CLASSLIST = "classlist";
    private static final String BASETABLE = "table";
 
    /**
     * 1、从数据库commonnum.db中查询分组个数
     * select count(*) from classlist;
     *
     * @return 查询成功,返回分组个数;否则返回-1
     */

    public static int getGroupCount() {
        int groupCount = 0;
        SQLiteDatabase database = SQLiteDatabase.openDatabase(PATH, null, SQLiteDatabase.OPEN_READONLY);
        Cursor groupCursor = database.query(CLASSLIST, new String[]{"count(*)"}, null, null, null, null, null);
        if (groupCursor.moveToNext()) {
            groupCount = groupCursor.getInt(0);
        }
        groupCursor.close();
        database.close();
        return groupCount;
    }
 
    /**
     * 2、从数据库commonnum.db中查询分组中孩子的个数
     * select count(*) from classlist;
     *
     * @param groupPosition 哪一个分组id
     * @return 查询成功,返回groupPosition分组下孩子的个数;否则返回-1
     */

    public static int getChildrenCount(int groupPosition) {
        int childCount = 0;
        SQLiteDatabase database = SQLiteDatabase.openDatabase(PATH, null, SQLiteDatabase.OPEN_READONLY);
        Cursor childCursor = database.query(BASETABLE+groupPosition,  new String[]{"count(*)"}, null, null, null, null, null);
        if (childCursor.moveToFirst()) {
            childCount=  childCursor.getInt(childCursor.getColumnIndex("count(*)"));
        }
        childCursor.close();
        database.close();
        return childCount;
    }
 
    /**
     * 3、从数据库commonnum.db中查询每个group的名字 返回某个位置分组的名称
     *
     * select name from classlist where idx = 1;
     *
     * @param groupPosition 哪一个group
     * @return 如果查询成功,返回group的名字;否则,返回null。
     */

    public static String getGroupViewName(int groupPosition) {
        String  groupName = null;
        SQLiteDatabase database = SQLiteDatabase.openDatabase(PATH, null, SQLiteDatabase.OPEN_READONLY);
        Cursor groupNameCursor = database.query(CLASSLIST, new String[]{"name"}, "idx=?", new String[]{String.valueOf(groupPosition)}, null, null, null);
        if (groupNameCursor.moveToNext()) {
            groupName = groupNameCursor.getString(groupNameCursor.getColumnIndex("name"));
        }
        groupNameCursor.close();
        database.close();
        return groupName;
    }
 
    /**
     * 4、从数据库commonnum.db中查询每个group下面对应的孩子的名字
     *
     * @param groupPosition 哪一个group
     * @param childPosition 孩子在哪一个group的位置
     * @return  如果查询成功,返回对应孩子的名字;否则,返回null。
     */

    public static String getChildName(int groupPosition,int childPosition) {
        String childName = null;
        SQLiteDatabase database = SQLiteDatabase.openDatabase(PATH, null, SQLiteDatabase.OPEN_READONLY);
        Cursor childNameCursor = database.query(BASETABLE+groupPosition, new String[]{"name"}, "_id=?", new String[]{String.valueOf(childPosition)}, null, null, null);
        if (childNameCursor.moveToNext()) {
            childName =  childNameCursor.getString(childNameCursor.getColumnIndex("name"));
        }
        childNameCursor.close();
        database.close();
        return childName;
    }
 
    /**
     * 5、从数据库commonnum.db中查询每个group下面对应的孩子的号码
     *
     * @param groupPosition 哪一个group
     * @param childPosition 孩子在哪一个group的位置
     * @return  如果查询成功,返回对应孩子的电话号码;否则,返回null。
     */

    public static String getChildNum(int groupPosition,int childPosition) {
        String childNum = null;
        SQLiteDatabase database = SQLiteDatabase.openDatabase(PATH, null, SQLiteDatabase.OPEN_READONLY);
        Cursor childNumCursor = database.query(BASETABLE+groupPosition, new String[]{"number"}, "_id=?", new String[]{String.valueOf(childPosition)}, null, null, null);
        if (childNumCursor.moveToNext()) {
            childNum =  childNumCursor.getString(childNumCursor.getColumnIndex("number"));
        }
        childNumCursor.close();
        database.close();
        return childNum;
    }
}
3、在高级工具增加条目——常见号码查询
4、编写一个新的CommnumNumberActivity及activity_commonnumber_query.xml布局文件,用于显示常见号码查询-ExpandableListView
5、CommnumNumberActivity设置ExpandableListView中的数据
package cn.zengfansheng.mobilesafe;
 
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.TextView;
import cn.zengfansheng.mobilesafe.db.dao.CommonNumberDao;
 
/**
* 13、常见号码查询的Activity界面
* @author hacket
*/

public class CommnumNumberActivity extends Activity {
 
    public static final String TAG = "CommnumNumberActivity";
 
    private ExpandableListView el_common_number;// 常见号码查询
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_commonnumber_query);
 
        el_common_number = (ExpandableListView) this.findViewById(R.id.el_common_number_advanced_tools);
        el_common_number.setAdapter(new MyCommonNumberQueryAdapter());
 
        // 注册点击孩子的事件
        el_common_number.setOnChildClickListener(new OnChildClickListener() {
 
            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                    int groupPosition, int childPosition, long id) {
 
                //1、获取点击的条目的号码
                String childNum = CommonNumberDao.getChildNum(groupPosition+1,childPosition+1);
 
           //拨号界面,设置电话号码到拨号界面
                // 2、开启拨号界面,并设置该号码到拨号界面
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_DIAL);
                intent.setData(Uri.parse("tel:" + childNum));
                startActivity(intent);
                return true;
            }
        });
    }
 
    /**
     * 1、常见号码查询adapter-MyCommonNumberQueryAdapter
     * @author hacket
     */

    private class MyCommonNumberQueryAdapter extends BaseExpandableListAdapter {
 
        // 分组个数
        @Override
        public int getGroupCount() {
            return CommonNumberDao.getGroupCount();
        }
 
        // 分组中的孩子
        @Override
        public int getChildrenCount(int groupPosition) {
 
            return CommonNumberDao.getChildrenCount(groupPosition + 1);// 记得加1
        }
 
        @Override
        public Object getGroup(int groupPosition) {
            return null;
 
        }
        @Override
        public Object getChild(int groupPosition, int childPosition) {
            return null;
        }
 
        @Override
        public long getGroupId(int groupPosition) {
            return 0;
        }
 
        @Override
        public long getChildId(int groupPosition, int childPosition) {
            return 0;
        }
 
        @Override
        public boolean hasStableIds() {
            return false;
        }
 
        // 设置每个分组的名字
        @Override
        public View getGroupView(int groupPosition, boolean isExpanded,
                View convertView, ViewGroup parent) {
            String groupViewName = CommonNumberDao.getGroupViewName(groupPosition+1);
            TextView groupView = new TextView(CommnumNumberActivity.this);
            groupView.setHeight(70);
            groupView.setTextSize(20);
            groupView.setText("        " + groupViewName);
            return groupView;
        }
 
        // 设置每个分组下面的孩子的名字和电话号码
        @Override
        public View getChildView(int groupPosition, int childPosition,
                boolean isLastChild, View convertView, ViewGroup parent) {
 
            String childName = CommonNumberDao.getChildName(groupPosition + 1,childPosition + 1);
            String childNumber = CommonNumberDao.getChildNum(groupPosition + 1,childPosition + 1);
            TextView childView = new TextView(CommnumNumberActivity.this);
            childView.setHeight(70);
            childView.setTextSize(15);
            childView.setText("      " + childName + "\n" + "      "+ childNumber);
            return childView;
        }
 
        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            Log.i(TAG, "点击了~~~" + groupPosition + ":" + childPosition);
            return true;// 设置孩子可以被点击
        }
 
    }
}

ExpandableListView类
package cn.zengfansheng.expandlistview;
 
import java.util.Random;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
    private ExpandableListView expandableListView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        expandableListView = (ExpandableListView) this
                .findViewById(R.id.expand_listview);
        expandableListView.setAdapter(new MyExpandListView());
    }
 
    private class MyExpandListView extends BaseExpandableListAdapter {
 
        // 分组个数
        @Override
        public int getGroupCount() {
            return 8;
 
        }
 
        // 每个分组孩子个数
        @Override
        public int getChildrenCount(int groupPosition) {
            Random random = new Random();
            return random.nextInt(10) + 1;
        }
 
        // 返回分组对象
        @Override
        public Object getGroup(int groupPosition) {
            return null;
        }
 
        // 返回某个分组,某个位置上的对象
        @Override
        public Object getChild(int groupPosition, int childPosition) {
            return null;
 
        }
 
        // 分组id
        @Override
        public long getGroupId(int groupPosition) {
            return 0;
 
        }
 
        // 分组id,第几个孩子
        @Override
        public long getChildId(int groupPosition, int childPosition) {
            return 0;
        }
 
        // 是否固定
        @Override
        public boolean hasStableIds() {
            System.out.println("hasStableIds:");
            return true;
        }
 
        // ***** 分组
        @Override
        public View getGroupView(int groupPosition, boolean isExpanded,
                View convertView, ViewGroup parent) {
            TextView groupView = new TextView(MainActivity.this);
            groupView.setText("        我的大分组~~~" + groupPosition + ":" + isExpanded);
            return groupView;
        }
 
        // ***** 分组下的孩子
        @Override
        public View getChildView(int groupPosition, int childPosition,
                boolean isLastChild, View convertView, ViewGroup parent) {
            TextView childView = new TextView(MainActivity.this);
            childView.setText("我的第" + groupPosition + "个分组~~~第" + childPosition
                    + "个孩子~~~" + "是否最后一个孩子" + isLastChild);
            return childView;
        }
 
        // 默认情况下,孩子是不可以被点击的
        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }
    }
}