在最近的开发中,遇到一个问题,在自己开发的通讯录中,500条联系人加载时慢的问题。
最初把同步本地通讯录的操作,放在软件的loading页去做,把联系人读到缓存中,发现当数据大时,loading页会进入得很慢。然后试着用CursorAdapter去做,实现列表滚动去读数据库,但又发现当用户平凡刷列表时,会出现内存溢出的情况。
那怎么办呢,于是我综合两种情况的优点,进行了合并。当用户在滑动列表时,会把列表显示的部分通过读数据。读出来的数据放入一个MAP中,那么当用户下一次滑到之前的位置时,只需要从MAP中读取数据了。这样即解决了数据量大量,加载到缓存慢,又解决了滑动列表卡的问题。下面是代码
1.首先通过android 通讯录数据库提供的索引表ContactsContract.RawContacts.CONTENT_URI把所有的联系人ID查询出来。
private List<Long> loadAllContactIds(){
List<Long> arr = new ArrayList<Long>();
Cursor cursor = cr.query(ContactsContract.RawContacts.CONTENT_URI, null, ContactsContract.RawContacts.DELETED + " = 0",null,null);
if(null != cursor && cursor.moveToFirst()){
do{
long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID));
arr.add(id);
}while(cursor.moveToNext());
cursor.close();
}
return arr;
}
2.再通过ID把联系人的各种信息读出来。
private String loadAllContactInfo(long id){
Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.RAW_CONTACT_ID + " = "+id,null,null);
StringBuffer sb = new StringBuffer();
if(null != cursor && cursor.moveToFirst()){
do{
String type = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.MIMETYPE));
if(type.equals(StructuredName.CONTENT_ITEM_TYPE)){
sb.append(cursor.getString(cursor.getColumnIndex(StructuredName.DISPLAY_NAME))).append("|");
}else if(type.equals(Nickname.CONTENT_ITEM_TYPE)){
sb.append(cursor.getString(cursor.getColumnIndex(Nickname.NAME))).append("|");
}else if(type.equals(Phone.CONTENT_ITEM_TYPE)){
sb.append(cursor.getString(cursor.getColumnIndex(Phone.NUMBER))).append("|");
}else if(type.equals(Event.CONTENT_ITEM_TYPE) && Event.TYPE.equals(Event.TYPE_BIRTHDAY)){
sb.append(cursor.getString(cursor.getColumnIndex(Event.DATA1))).append("|");
}
}while(cursor.moveToNext());
cursor.close();
}
return sb.toString();
}
3.自定义的adapter ,
private class MyAdapter extends BaseAdapter{
private List<Long> ids;
private Map<Long,String> maps;
public MyAdapter(List<Long> ids){
this.ids = ids;
maps = new HashMap<Long, String>();
}
@Override
public int getCount() {
return this.ids.size();
}
@Override
public Object getItem(int position) {
return this.ids.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(null == convertView){
convertView = LayoutInflater.from(TextTextActivity.this).inflate(android.R.layout.simple_list_item_1, null);
}
long id = ids.get(position);
if(convertView instanceof TextView){
String res = maps.get(id);
TextView tv = (TextView)convertView;
if(TextUtils.isEmpty(res)){
res = loadAllContactInfo(id);
maps.put(id, res);
}
tv.setText(res);
}
return convertView;
}
}
分享到:
相关推荐
Android通讯录附搜索及字母索引Demo,基于网友的版本改进,修复搜索异常的bug
Android通讯录源码Android通讯录源码Android通讯录源码
广工大数据库课程设计 广工校友福利你懂的
android通讯录简单项目源码android通讯录简单项目源码android通讯录简单项目源码
使用android通讯录中的内容提供者,实现查询和增加联系人。经测试,可用
关于Android通讯录获取及操作详细demo
android通讯录demo
Android通讯录源代码
使用adt-bundle-windows编写的android通讯录系统,实现增删改查功能。
android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android ...
模仿android通讯录,可右侧按字母互动,搜索,顶部提示
android 通讯录 android2.3
Android通讯录_字母导航_字母悬浮
Android手机通讯录实验报告.pdf
基于Android通讯录课程设计报告.pdf
Android 通讯录 字母导航 字母悬浮
上传一个最近做的操作android通讯录的代码吧。 当时找了很久也没找到,大部分帖子都是抄袭人家的,功能没有实现也不说给改改。连名字都不改就上传,悲剧。 如有问题,随时与我联系,代码里有邮件地址
android通讯录代码(非原生android)
Android源码通讯录的开发_完整代码.zip
由于本人多次在不同的电话、软件中进行通讯录同步、备份、恢复等处理,导致一些电话类型记录错误,也就是手机号(2)被记录...该程序可以作为一个Android通讯录处理(读/写)的例子。代码很简单,有需要的可以做个参考。