package com.loaderman.expandablelistviewdemo;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import java.util.ArrayList; /**
* <p>
* 常用号码数据库查询
*/ public class CommonNumberDao { //获取所有常用号码
public static ArrayList<GroupInfo> getCommonNumbers(Context ctx) { SQLiteDatabase database = SQLiteDatabase.openDatabase(ctx.getFilesDir()
.getAbsolutePath() + "/commonnum.db", null,
SQLiteDatabase.OPEN_READONLY); Cursor cursor = database.query("classlist", new String[]{"name", "idx"}, null, null,
null, null, null); ArrayList<GroupInfo> list = new ArrayList<>();
if (cursor != null) { while (cursor.moveToNext()) {
GroupInfo info = new GroupInfo(); info.name = cursor.getString(0);
info.idx = cursor.getString(1);
info.children = getChildrenList(info.idx, database);//获取当前组的孩子信息 list.add(info);
} cursor.close();
} database.close(); return list;
} //获取某组所有电话号码
private static ArrayList<ChildInfo> getChildrenList(String idx, SQLiteDatabase database) {
Cursor cursor = database.query("table" + idx, new String[]{"number", "name"}, null, null,
null, null, null); ArrayList<ChildInfo> list = new ArrayList<>();
if (cursor != null) { while (cursor.moveToNext()) {
ChildInfo info = new ChildInfo();
info.number = cursor.getString(0);
info.name = cursor.getString(1);
list.add(info);
} cursor.close();
} //database.ose();不能关闭数据库, 在getCommonNumbers中统一关闭数据库 return list;
} public static class GroupInfo {
public String name;
public String idx;
public ArrayList<ChildInfo> children;//当前组的所有电话号码
} public static class ChildInfo {
public String name;
public String number;
} }
package com.loaderman.expandablelistviewdemo;

import android.content.Intent;
import android.content.res.AssetManager;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private ArrayList<CommonNumberDao.GroupInfo> mList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
copyDb("commonnum.db");//拷贝常用号码数据库
ExpandableListView elv = (ExpandableListView) findViewById(R.id.elv_list);
//获取所有常用号码
mList = CommonNumberDao.getCommonNumbers(this);
elv.setAdapter(new MyAdapter());
elv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
Intent intent = new Intent(Intent.ACTION_DIAL);//进入拨号页面
intent.setData(Uri.parse("tel:" + mList.get(groupPosition).children.get
(childPosition).number));
startActivity(intent);
return false;
}
});
} private class MyAdapter extends BaseExpandableListAdapter {
//返回组的个数
@Override
public int getGroupCount() {
return mList.size();
}
//返回某组孩子个数
@Override
public int getChildrenCount(int groupPosition) {
return mList.get(groupPosition).children.size();
}
//getItem:返回组对象
@Override
public CommonNumberDao.GroupInfo getGroup(int groupPosition) {
return mList.get(groupPosition);
}
//返回孩子对象
@Override
public CommonNumberDao.ChildInfo getChild(int groupPosition, int childPosition) {
return mList.get(groupPosition).children.get(childPosition);
} @Override
public long getGroupId(int groupPosition) {
return groupPosition;
} @Override
public long getChildId(int groupPosition, int childPosition) {
return groupPosition; }
//是否有固定id, 默认就可以,不需要改动
@Override
public boolean hasStableIds() {
return false;
}
//getView:返回组的布局对象
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
TextView view = new TextView(MainActivity.this);
//view.setText("第" + groupPosition + "组");
CommonNumberDao.GroupInfo info = getGroup(groupPosition);
view.setText(info.name);
view.setBackgroundColor(Color.GRAY);
view.setPadding(50, 10, 10, 10);
view.setTextSize(18);
return view;
}
//返回子布局对象
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
TextView view = new TextView(MainActivity.this);
//view.setText("第" + groupPosition + "组" + "-第" + childPosition + "项");
CommonNumberDao.ChildInfo info = getChild(groupPosition, childPosition);
view.setText(info.name + "\n" + info.number);
view.setPadding(10, 10, 10, 10);
view.setTextSize(16);
return view;
}
//孩子是否可以点击
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
private void copyDb(String dbName) {
//拷贝文件, 输入流-->输出流
//输出流
//data/data/包名/files
File filesDir = getFilesDir();
File desFile = new File(filesDir, dbName);//目标文件 //数据库只需要拷贝一次
if (desFile.exists()) {
System.out.println("数据库" + dbName + "已经存在,无需拷贝!");
return;
} AssetManager assets = getAssets();//资产目录管理器 InputStream in = null;
FileOutputStream out = null;
try {
in = assets.open(dbName);//获取资产目录文件的输入流
out = new FileOutputStream(desFile);//输出流 int len = 0;
byte[] buffer = new byte[1024 * 8];
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
} out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
} System.out.println("拷贝数据库" + dbName + "完成!!!");
}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.loaderman.expandablelistviewdemo.MainActivity">
<!--android:groupIndicator="@null" 可以去掉那个指示箭头-->
<ExpandableListView
android:id="@+id/elv_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
></ExpandableListView>
</LinearLayout>

效果:

利用ExpandableListView实现常用号码查询功能的实现的更多相关文章

  1. Python与数据库[2] -> 关系对象映射/ORM[5] -> 利用 sqlalchemy 实现关系表查询功能

    利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例 ...

  2. 利用PHP访问数据库——实现分页功能与多条件查询功能

    1.实现分页功能 <body><table width="100%" border="1">  <thead>    < ...

  3. JQuery常用函数及功能

    JQuery常用函数及功能小结 来源:http://blog.csdn.net/screensky/article/details/7831000 1.文档加载完成执行函数 $(document).r ...

  4. RPM软件包管理的查询功能

    以后大家升级rpm包的时候,不要用Uvh了! 我推荐用Fvh 前者会把没有安装过得包也给装上,后者只会更新已经安装的包   总结:未安装的加上小写p,已安装的不需要加p   查询q    rpm {- ...

  5. 利用kibana插件对Elasticsearch查询

    利用kibana插件对Elasticsearch查询 Elasticsearch是功能非常强大的搜索引擎,使用它的目的就是为了快速的查询到需要的数据. 查询分类: 基本查询:使用Elasticsear ...

  6. Vc数据库编程基础MySql数据库的表查询功能

    Vc数据库编程基础MySql数据库的表查询功能 一丶简介 不管是任何数据库.都会有查询功能.而且是很重要的功能.上一讲知识简单的讲解了表的查询所有. 那么这次我们需要掌握的则是. 1.使用select ...

  7. RPM软件包管理的查询功能 转

    RPM软件包管理的查询功能: 命令格式 rpm {-q|--query} [select-options] [query-options] RPM的查询功能是极为强大,是极为重要的功能之一:举几个常用 ...

  8. Extjs tree 过滤查询功能

    转载: http://blog.csdn.net/xiaobai51509660/article/details/36011899 Extjs4.2中,对于treeStore中未实现filterBy函 ...

  9. 利用solr实现商品的搜索功能

      后期补充: 为什么要用solr服务,为什么要用luncence? 问题提出:当我们访问购物网站的时候,我们可以根据我们随意所想的内容输入关键字就可以查询出相关的内容,这是怎么做到呢?这些随意的数据 ...

随机推荐

  1. fastadmin 相同的查询条件在不同的控制器里where条件为什么会不一样

    第一个图片在id前面加了模型名是因为第一个控制器 //当前是否为关联查询 $this->relationSearch = true;

  2. U盘加载速度慢的解决方法

    在日常的生活和工作中,我们经常用U盘存储一些文件和程序.然而,一些朋友发现U盘有时候在使用过程中的识别加载速度非常缓慢.是U盘出故障了吗?其实不尽然,下面就为大家分享一下如何快速解决U盘加载缓慢的方法 ...

  3. 【转】草根老师的 linux字符设备驱动详解

    Linux 驱动 之 模块化编程 Linux 驱动之模块参数和符号导出 Linux 设备驱动之字符设备(一) Linux 设备驱动之字符设备(二) Linux 设备驱动之字符设备(三)

  4. 03-【request对象获取请求的数据 & request对象存取值】

    request概述(封装了客户端所有的请求数据) request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest.在 ...

  5. redis编译和安装出现错误

    redis编译到时候出现错误,记录一下原因 1.下载redis,https://redis.io/download ,一般选择稳定版本,稳定版的版本号是偶数,当前最新版本是5.0.4,Linux可直接 ...

  6. unix/linux共享库(动态库)简介

    一.创建共享库: 1.写源程序 xxx1.c xxx2.c.../*.c(通配符方式) 2.编译源程序,加-fpic生成.o文件 gcc -c -fpic xxx1.c xxx2.c.../*.c(通 ...

  7. python异常:常见异常、处理、断言、自定义异常

    一.异常是什么 二.常见异常 三.异常处理 四.不太常用语法 五.主动判处异常 六.断言 七.使用场景 八.自定义异常类型 一.异常是什么 """ 什么是异常? 异常是错 ...

  8. pip命令及虚拟环境的建立

    以下命令是pip命令,是帮助我们安装解决python所需要的环境包 列出已经安装的包 pip list 安装要安装的包 pip install 包名 安装特定版本 pip install django ...

  9. [AWS - EC2]如何使用 PuTTY 连接到 Amazon Linux 2 实例。How to Connect Amazon Linux 2 Instance from Windows Using PuTTY

    1. 下载 PuTTY 2. 安装到任意目录 3. 打开 PuTTYgen (注意不是 PuTTY), 如图: 选择 RSA , 点击 Load. 找到从 AWS 创建实例的时候生成的 key,要选择 ...

  10. JS 获取和返填单选按钮Value值

    1.获取Radio值 $('input[name="sex"]:checked ').val(); 2.返填Radio值 $('input[name="sex" ...