学习笔记-ContentProvider与listview结合显示电话本信息

ContentProvider是Android四大组件(Activity,intent,service,contentProvider)之一,它实现了一组标准方法,能够让其他引用保存或读取contentprovider处理的各种数据类型。
在android中,由于每个应用程序独立运行在自己的虚拟机中,在正常情况下,不能读取其他应用的db文件,因此需要contentProvider来解决不同应用程序间的数据共享问题。
android自身提供了现成的contentProvider:Contacts,Browser,CallLog,Settings,MediaStore。通过唯一的contentResolver来使用需要的contentProvider,resolver提供了query,insert,update等方法,使用时可能需要URI(String类型的contentProvider完整路径).

以查询联系人姓名和电话为例,整体处理逻辑为:
创建listData,listview-->获取contentResolver对象-->得到电话本的cursor-->遍历cursor-->关闭cursor-->创建listadapter-->加入到listview-->添加listview事件。
遍历cursor的逻辑为:
创建map-->得到联系人姓名-->加入map-->处理多个号码-->加入map-->map加入listData
处理多个号码的逻辑为:
得到号码的cursor2-->遍历cursor2(获取号码-->处理号码显示

代码如下:
参考http://blog.sina.com.cn/s/blog_48843e730100m6nw.html对读取多个号码的补充。

package com.helen;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.PhoneLookup;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class ContactBook extends Activity {
ListView m_lstView; // 列表
ArrayList<Map<String, String>> lstData;
private static final String NAME = "name";
private static final String NUMBER = "number";

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); // 设置布局
m_lstView = (ListView) findViewById(R.id.lst_contacts); // 获取xml中定义的listview
lstData = new ArrayList<Map<String, String>>();
String number = "";

// 获取数据库电话本的cursor
ContentResolver cr = getContentResolver();
// 取得电话本中开始一项的光标
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, null);
startManagingCursor(cur);

while (cur.moveToNext()) {
Map<String, String> mp = new HashMap<String, String>();
String cons = cur.getString(cur
.getColumnIndex(PhoneLookup.DISPLAY_NAME));
mp.put(NAME, cons); // 添加联系人姓名

// 获取联系人电话号码,处理多个号码的情况,不能直接使用PhoneLookup.NUMBER
long id = cur.getLong(cur.getColumnIndex(PhoneLookup._ID));
Cursor numCur = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="
+ Long.toString(id), null, null);

while (numCur.moveToNext()) {
String strPhoneNumber = numCur
.getString(numCur
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
number += strPhoneNumber + "";
}
number += "\n";
numCur.close();

//添加到map中,并将map添加到lstData
mp.put(NUMBER, number);
lstData.add(mp);
}

cur.close();

// listAdapter存储后台数据,然后将其显示在listView中,是关键桥梁
ListAdapter lstAdp = new SimpleAdapter(this, lstData,
// 定义list中每一行的显示模板
// 这里使用android自定义的layout,表示每行包括两个数据项,也可以使用自己定义的模板
android.R.layout.simple_list_item_2,
// 需要取出的字段
new String[] { NAME, NUMBER },
// 与上面数据库字段相对应的显示样式
new int[] { android.R.id.text1, android.R.id.text2 });

// 将adp添加到listview中
m_lstView.setAdapter(lstAdp);
// 为listview中的每一项添加事件监听
// 鼠标滚动事件
m_lstView
.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
// 可以加入自己的事件
display("滚动到第 "
+ Long.toString(arg0.getSelectedItemId()) + "项");
}

@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub

}

});

// 鼠标点击事件
m_lstView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
display("选中第 " + Long.toString(arg0.getSelectedItemId()) + "项");
}
});
}

/**
* 显示Toast提示信息
*
* @param str
*/
private void display(String str) {
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
}
}

main.xml中添加Listview:
<ListView
android:id="@+id/lst_contacts"
android:layout_width="wrap_content"
android:layout_height="fill_parent">
</ListView>

由于读取系统中的联系人列表,因此需要在androidmanifest.xml中添加权限:
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

运行效果如图:
[img]http://dl.iteye.com/upload/attachment/439328/78364461-63f1-30d4-973c-2015c2148405.png[/img]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值