在最近的开发中,遇到一个问题,在自己开发的通讯录中,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平台上,构建一个功能完善的通讯录应用是开发者经常面临的需求。这个"Android通讯录附搜索及字母索引Demo"项目旨在提供一个示例,帮助开发者理解和实现类似原生Android系统通讯录的功能,包括联系人搜索和...
"基于Android+SQLite的手机通讯录管理器" 知识点一:Android平台下的数据库管理 Android平台下,SQLite是最常用的数据库管理系统。SQLite是一种轻量级的 Relation Database Management System(关系数据库管理系统...
android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android ...
在Android平台上,开发一个完整的通讯录应用涉及到许多关键知识点,这些知识点构成了Android应用程序设计的基础。以下将详细解析这个项目的相关技术点: 1. **Activity与Intent**:Android应用中的核心组件是...
同时,考虑到内存使用,可以使用`CursorLoader`配合`ContentProvider`来异步加载和管理通讯录数据,避免一次性加载大量数据导致内存压力。 总结起来,这个项目涵盖了Android UI设计、数据处理、事件监听、搜索功能...
【Android通讯录源代码解析】 在移动设备上,通讯录是一个至关重要的功能,它帮助用户存储、管理和查找联系人的信息。本项目是基于Java语言开发的Android通讯录应用,提供了全面的通讯录功能,旨在帮助开发者理解...
在这个实例中,我们将深入探讨如何使用Android通讯录的内容提供者来查询和添加联系人。 一、Android内容提供者基础 内容提供者是一个实现了ContentProvider类的组件,它负责存储、检索以及更新应用程序的数据。每个...
《Android通讯录系统详解——基于adt-bundle-windows的实现》 在移动设备上,通讯录是用户日常使用的重要功能之一。Android系统以其开放性和灵活性,为开发者提供了丰富的API,使得开发自定义通讯录应用成为可能。...
通过以上分析,我们可以看出,【仿android通讯录demo】项目涵盖了Android开发的多个关键领域,包括UI设计、数据操作、事件处理、权限管理以及用户体验优化等,是学习和实践Android开发的一个良好实例。
【Android通讯录源代码】是Android平台上实现联系人管理功能的一种源码实现,它涉及到Android系统的核心组件和服务,包括数据库操作、UI设计、数据存储和检索等关键知识点。在这个源码中,我们可以深入理解Android...
android通讯录demo
《Android通讯录项目详解》 在移动开发领域,Android平台上的通讯录管理是不可或缺的一部分,它涉及到用户数据的存储、查询、更新以及删除等操作。本篇将详细探讨基于Android的通讯录项目,主要涉及的技术点包括...
【Android通讯录源码分析】 本项目是一款基于Android平台的通讯录应用,它不仅提供了基本的本地联系人存储和检索功能,还集成了拨打电话和发送短信的能力,非常适合用于学习和理解Android应用开发中的核心概念和...
在Android系统中,通讯录是用户管理联系人信息的重要工具,它允许用户存储、查找和管理他们的联系人数据。...在实际开发中,还需要考虑性能优化、隐私保护以及不同设备和Android版本的兼容性问题。
Android 通讯录小软件开发 本资源是一个 Android 通讯录小软件的开发实践,包括了 Android 通讯录的开发、 SQLite 数据库的使用、联系人信息的存储和管理等方面的知识点。 一、Android 通讯录的开发 Android ...
在Android平台上,开发一个通讯录应用是学习移动应用开发的基础步骤之一。这个“自己做的android通讯录”项目,显然是一个初学者为了掌握Android编程而创建的。它涉及到的关键知识点包括Android应用的基本架构、数据...
对于大量联系人的情况,需要考虑性能优化,比如使用CursorLoader进行异步加载,避免一次性加载所有联系人导致内存压力过大。 10. **测试与调试**: 对通讯录应用进行全面的测试,确保在不同设备和系统版本上的...
在Android平台上,构建一个通讯录应用是常见的任务,涉及到用户界面设计、数据存储与检索、权限管理等多个核心知识点。这份"Android通讯录源码"提供了一个实现这一功能的实例,让我们来深入探讨其中的关键技术。 1....
此外,为了优化性能,我们需要考虑异步加载和数据绑定。在用户输入时,后台线程可以执行搜索操作,避免阻塞UI线程。同时,数据绑定框架如`RecyclerView`的`Adapter`可以自动更新列表项,使得搜索结果能够即时显示。 ...
在Android平台上,开发一个完整的通讯录应用涉及到许多关键知识点,包括数据存储、用户界面设计、查询与搜索功能、图片处理以及权限管理等。下面将详细阐述这些内容。 1. 数据存储:Android通讯录通常使用SQLite...