Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录的实现以及ListView的优化
Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录的实现
Android四大组件是啥这里就不用多说了,看图吧,他们之间通过intent通讯
我们后续也会一一的为大家讲解,今天就使用内容提供者ContentProvider查询系统的数据库来获取联系人,我们用listview装载
我们新建一个项目就叫MyPhone吧
并且添加权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>
一,获取联系人
我们可以新建一个Class——GetPhone,这样吧,我们先在手机里创建两个联系人
GetPhone
package com.lgl.myphone;
import android.content.Context;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.util.Log;
/**
* 获取手机联系人
* Created by LGL on 2016/1/24.
*/
public class GetPhone {
//获取通讯录的方法
public static String getPhone(Context context) {
/**
* 1.系统给了我们一个接口访问
* 2.3.4.5也是查询条件,这我们并不需要
* 并且返回一个Cursor类型的参数
*/
Cursor query = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
//创建一个对象进行储存
String name; //联系人
String phone; //电话号码
//我们获取到这些信息之后遍历出来
while (query.moveToNext()) {
//获取名字就需要Phone.DISPLAY_NAME
name = query.getString(query.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
//获取num字段需要Phone.NUMBER
phone = query.getString(query.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Log.i("字段", name + ":" + phone);
}
return null;
}
}
然后我们只要在MainActivity中调用就可以了
//调用查询
GetPhone.getPhone(this);
运行一下
也是成功的打印出来了
二,数据存储
我们既然要用到这些读取出来的数据,就需要先把这些数据给存储起来,我们新建一个Class类——Bean,声明一个name和一个phone,并且生成他们的set和get方法
package com.lgl.myphone;
/**
* 数据存储
* Created by LGL on 2016/1/24.
*/
public class Bean {
private String name;
private String phone;
public Bean(String name, String phone) {
setName(name);
setPhone(phone);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
这样的话我们就可以去封装了,这里封装也是很简单,直接在GetPhone这个类里面声明一个list集合
public static List<Bean>list = new ArrayList<Bean>();
然后我们可以将这个写数据装载起来
Bean bean = new Bean(name,phone);
list.add(bean);
三,实现自定义Adapter
考虑到这个项目的扩展性,我们的adapter一般都是自己实现继承BaseAdapter,今天,我们也来实现以下,并且放几张头像上去
ListAdapter
package com.lgl.myphone;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.List;
/**
* Created by LGL on 2016/1/24.
*/
public class ListAdapter extends BaseAdapter {
private List<Bean> list;
//承接上下文
private Context context;
private RelativeLayout layout;
//构造方法
public ListAdapter(List<Bean> list, Context context) {
this.list = list;
this.context = context;
}
//返回的是集合的数量,大小
@Override
public int getCount() {
return list.size();
}
//返回当前这条数据
@Override
public Object getItem(int position) {
return list.get(position);
}
//获取当前的ID
@Override
public long getItemId(int position) {
//id和position是相等的
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
/**
* 我们要获取当前视图的View并且加载到视图当中
*/
LayoutInflater inflater = LayoutInflater.from(context);
layout = (RelativeLayout) inflater.inflate(R.layout.list_item, null);
TextView tv_name = (TextView) layout.findViewById(R.id.tv_name);
TextView tv_phone = (TextView) layout.findViewById(R.id.tv_phone);
//添加内容
tv_name.setText(list.get(position).getName());
tv_phone.setText(list.get(position).getPhone());
return layout;
}
}
接着我们使用就可以了,在MainActivity中
//初始化listview
listview = (ListView) findViewById(R.id.listview);
listAdapter = new ListAdapter(GetPhone.list,this);
listview.setAdapter(listAdapter);
运行一下,就知道效果了
四,ListView的优化ViewHolder
事实上,listview的优化已经见怪不怪了,当我们的通讯录需要加载几千条数据的时候,我们就有必要的进行一些优化了,那就是使用viewholder
package com.lgl.myphone;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.List;
/**
* Created by LGL on 2016/1/24.
*/
public class ListAdapter extends BaseAdapter {
private List<Bean> list;
//承接上下文
private Context context;
private RelativeLayout layout;
//构造方法
public ListAdapter(List<Bean> list, Context context) {
this.list = list;
this.context = context;
}
//返回的是集合的数量,大小
@Override
public int getCount() {
return list.size();
}
//返回当前这条数据
@Override
public Object getItem(int position) {
return list.get(position);
}
//获取当前的ID
@Override
public long getItemId(int position) {
//id和position是相等的
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
/**
* 我们要获取当前视图的View并且加载到视图当中
*/
// LayoutInflater inflater = LayoutInflater.from(context);
// layout = (RelativeLayout) inflater.inflate(R.layout.list_item, null);
//
// TextView tv_name = (TextView) layout.findViewById(R.id.tv_name);
// TextView tv_phone = (TextView) layout.findViewById(R.id.tv_phone);
//
// //添加内容
// tv_name.setText(list.get(position).getName());
// tv_phone.setText(list.get(position).getPhone());
ViewHolder holder;
//==null代表并没有记载view
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
holder.tv_phone = (TextView) convertView.findViewById(R.id.tv_phone);
//加载内容
holder.tv_name.setText(list.get(position).getName());
holder.tv_phone.setText(list.get(position).getPhone());
//第一次加载完毕后标签储存
convertView.setTag(holder);
} else {
//代表加载过了
holder = (ViewHolder) convertView.getTag();
//加载内容
holder.tv_name.setText(list.get(position).getName());
holder.tv_phone.setText(list.get(position).getPhone());
}
return convertView;
}
private static class ViewHolder {
TextView tv_name;
TextView tv_phone;
}
}
这样子就可以数据量再大也不会出现卡顿的现象了
弱弱的说一句:今天的深圳真冷啊
Demo下载地址:http://download.csdn.net/detail/qq_26787115/9416163
Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录的实现以及ListView的优化的更多相关文章
- Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听
Android实训案例(六)--四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听 Android中四大组件的使用时重中之重,我这个阶段也不奢望能把他 ...
- Android实训案例(八)——单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局
Android实训案例(八)--单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局 阿法狗让围棋突然就被热议了,鸿洋大神也顺势出了篇五子棋单机游戏的视频,我看到了就像膜拜膜拜,就 ...
- Android实训案例(四)——关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程!
Android实训案例(四)--关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程! 关于2048,我看到很多大神,比如医生,郭神,所以我也研究了一段时间,还好是研究 ...
- Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程
Android实训案例(九)--答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程 项目也是偷师的,决心研究一下数据库.所以写的还是很详细的,各位看官,耐着性子看完,实现结果不重要 ...
- Android实训案例(三)——实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果!
Android实训案例(三)--实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果! 感叹离春节将至,也同时感叹时间不等人,一年又一年,可是我依然是android道路上的小菜鸟,这篇讲 ...
- Android实训案例(二)——Android下的CMD命令之关机重启以及重启recovery
Android实训案例(二)--Android下的CMD命令之关机重启以及重启recovery Android刚兴起的时候,着实让一些小众软件火了一把,切水果,Tom猫,吹裙子就是其中的代表,当然还有 ...
- Android实训案例(一)——计算器的运算逻辑
Android实训案例(一)--计算器的运算逻辑 应一个朋友的邀请,叫我写一个计算器,开始觉得,就一个计算器嘛,很简单的,但是写着写着发现自己写出来的逻辑真不严谨,于是搜索了一下,看到mk(没有打广告 ...
- Android实训案例(七)——四大组件之一Service初步了解,实现通话录音功能,抽调接口
Service Service的神奇之处,在于他不需要界面,一切的操作都在后台操作,所以很多全局性(手机助手,语音助手)之类的应用很长需要这个,我们今天也来玩玩 我们新建一个工程--ServiceDe ...
- Android实训案例(七)——四大组件之中的一个Service初步了解,实现通话录音功能,抽调接口
Service Service的奇妙之处.在于他不须要界面,一切的操作都在后台操作,所以非常多全局性(手机助手,语音助手)之类的应用非常长须要这个.我们今天也来玩玩 我们新建一个project--Se ...
随机推荐
- Servlet规范总结
Servlet接口 Servlet规范的核心接口即是Servlet接口,它是所有Servlet类必须实现的接口,在Java Servelt API中已经提供了两个抽象类方便开发者实现Servlet类, ...
- 合成/聚合复用原则(CARP)
组合/聚合复用原则(Composite/Aggregate Reuse Principle或CARP),就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新对象通过向这些对象的委派达到 ...
- 【Android应用开发】Android 蓝牙低功耗 (BLE) ( 第一篇 . 概述 . 蓝牙低功耗文档 翻译)
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50515359 参考 : -- 官方文档 : https://develope ...
- 详解EBS接口开发之供应商导入(补充)--供应商银行账户更新
CREATE OR REPLACE PACKAGE BODY update_vendor_account IS PROCEDURE main(errbuf OUT VARCHAR2, retcode ...
- Linux系统编程----孤儿进程
什么是孤儿进程? 孤儿进程, 指在父进程退出后,而子进程还在运行,这个子进程就成了孤儿进程,这时由init进程(pid=1)接管 来看看例子: #include <stdio.h> #i ...
- iOS开发之音频播放AVAudioPlayer 类的介绍
主要提供以下了几种播放音频的方法: 1. System Sound Services System Sound Services是最底层也是最简单的声音播放服务,调用 AudioServicesPla ...
- [Python]程序性能分析
有些脚本发现比预期要慢的多,就需要找到瓶颈,然后做相应的优化,参考A guide to analyzing Python performance,也可以说是翻译. 指标 运行时间 时间瓶颈 内存使用 ...
- 钩子不仅仅是windows给你留的后门
说起钩子(Hook)熟悉windows开发的人应该比较熟悉,例如鼠标钩子.键盘钩子等.用简单的语言描述就是在正常处理流程中安置某个钩子,当执行到安置钩子的地方就将进入指定的钩子函数进行处理,待处理完再 ...
- volatile实现可见性但不保证原子性
volatile实现可见性但不保证原子性 volatile关键字: 能够保证volatile变量的可见性 不能保证volatile变量复合操作的原子性 volatile如何实现内存可见性: 深入来说: ...
- 并发编程(二):分析Boost对 互斥量和条件变量的封装及实现生产者消费者问题
请阅读上篇文章<并发编程实战: POSIX 使用互斥量和条件变量实现生产者/消费者问题>.当然不阅读亦不影响本篇文章的阅读. Boost的互斥量,条件变量做了很好的封装,因此比" ...