ListView显示数据的问题

尛桀 2010-11-01 03:07:05
现在我做了个读取联系人的功能,
但当联系人达到70多个以上的时候读取速度就很慢
往往要等上一段时间才能显示出来
有没有什么办法可以解决这种问题
就比如Android自带的联系人,点击进去马上就能显示!
...全文
813 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
尛桀 2010-11-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 chenkejun 的回复:]
看来频繁的读取数据库,对性能上有很大的影响啊。
至于android自带的电话簿的实现原理,我也不太清楚,也没有仔细读过源代码,没法给你更好的建议了。
[/Quote]

突然发现原来自带的会那么快是因为他未读取号码!只显示了姓名!
也看了他的API Demo里面有读取联系人和号码的代码,用的还是过时的People
chenkejun 2010-11-04
  • 打赏
  • 举报
回复
看来频繁的读取数据库,对性能上有很大的影响啊。
至于android自带的电话簿的实现原理,我也不太清楚,也没有仔细读过源代码,没法给你更好的建议了。
尛桀 2010-11-04
  • 打赏
  • 举报
回复
最后感谢楼上所有回答我的兄弟
特别感谢 chenkejun
尛桀 2010-11-04
  • 打赏
  • 举报
回复
已经解决
主要问题是每次循环的时候都用去查询一次数据库!这样大大降低了效率

我的解决方案是:
在onCreat中先把所有号码查出放在一个List里面
然后再查询联系人!根据联系人的Id和刚才的List做匹配
这样就减少了N次的数据库查询!
尛桀 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 showtang 的回复:]
建议看一下 API Demos/View/Lists/13.Slow Adapter 这个例子。
Demo 用的是延迟加载。
[/Quote]

恩!不是需要延迟加载的那种效果
尛桀 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dinjay 的回复:]
子线程中去处理list要显示的数据,然后处理完通过handler通知UI更新list
LZ,把你的联系人查询语句贴出来,可以自己通过添加SQL语句的过滤,只获取有用的联系人信息,而不是把联系人的所有信息都取出来。
[/Quote]


private List<Map<String, Object>> getData() {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

String[] p = new String[] {Contacts._ID,Contacts.DISPLAY_NAME,"smart",Contacts.LOOKUP_KEY,Contacts.HAS_PHONE_NUMBER};
Cursor cur = getContentResolver().query(Contacts.CONTENT_URI, p,
null, null, null);

if (cur.moveToFirst()) {

int idColumn = cur.getColumnIndex(Contacts._ID);
int displayNameColumn = cur.getColumnIndex(Contacts.DISPLAY_NAME);
int smartColumn = cur.getColumnIndex("smart");
int lookupColumn = cur.getColumnIndex(Contacts.LOOKUP_KEY);

do {
Map<String, Object> map = new HashMap<String, Object>();
String contactId = cur.getString(idColumn);

String displayName = null;

displayName = cur.getString(displayNameColumn);
String smart = cur.getString(smartColumn);
String lookup = cur.getString(lookupColumn);

int resource;
if (lookup.startsWith(IS_GSM_CARD)) {
resource = R.drawable.ic_contact_picture_g;
} else if (lookup.startsWith(IS_CDMA_CARD)) {
resource = R.drawable.ic_contact_picture_c;
} else {
resource = R.drawable.ic_contact_picture_local;
}

map.put("contactId", contactId);
map.put("smart", smart);
map.put("contactName", displayName);
map.put("lookup", resource);

int phoneCount = cur
.getInt(cur
.getColumnIndex(Contacts.HAS_PHONE_NUMBER));
String newNumber = "";
if (phoneCount > 0) {
Cursor phones = getContentResolver()
.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = "
+ contactId
+ " and "
+ ContactsContract.CommonDataKinds.Phone.TYPE
+ "="
+ ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE,
null, null);
if (phones != null && phones.moveToNext()) {
String phoneNumber = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

String[] splitNumber = phoneNumber.split("-");
for (int i = 0; i < splitNumber.length; i++) {
newNumber += splitNumber[i];
}

}
} else {
newNumber += NONE_TELEPHONENUMBER;
}
map.put("contactNumber", newNumber);
list.add(map);
} while (cur.moveToNext());
}
return list;
}
dinjay 2010-11-02
  • 打赏
  • 举报
回复
子线程中去处理list要显示的数据,然后处理完通过handler通知UI更新list
LZ,把你的联系人查询语句贴出来,可以自己通过添加SQL语句的过滤,只获取有用的联系人信息,而不是把联系人的所有信息都取出来。
ShowTang 2010-11-02
  • 打赏
  • 举报
回复
建议看一下 API Demos/View/Lists/13.Slow Adapter 这个例子。
Demo 用的是延迟加载。
牛叔 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ajdj1315 的回复:]

引用 3 楼 ameyume 的回复:
同求解决方案,我用ListView显示音乐列表,有200首音乐,读取显示的就很慢,大约要五六秒钟才能显示出来;而天天动听只要2秒左右就可以全显示出来。


纠结纠结啊!你是否已解决?
[/Quote]
listview延迟加载?貌似apidemo里面有例子
尛桀 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ameyume 的回复:]
同求解决方案,我用ListView显示音乐列表,有200首音乐,读取显示的就很慢,大约要五六秒钟才能显示出来;而天天动听只要2秒左右就可以全显示出来。
[/Quote]

纠结纠结啊!你是否已解决?
尛桀 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 chenkejun 的回复:]
以前做过类似的功能,代码已经找不到了,但印象里面和你的差不多。

你可以在你的代码中加一些log打印一下时间,看看在那些处理上面耗时多再想办法优化吧。

int idColumn = cur.getColumnIndex(Contacts._ID);
int displayNameColumn = cur.getColumnIndex(Contacts.DISPLAY_NAME);
i……
[/Quote]
首先很感谢你的回答

不过那些变量我没定义在循环的内部!只是在一个if里面

还有你的建议用Log打印时间我试过了!确实在是在这段数据库操作上耗时最多的!
chenkejun 2010-11-02
  • 打赏
  • 举报
回复
以前做过类似的功能,代码已经找不到了,但印象里面和你的差不多。

你可以在你的代码中加一些log打印一下时间,看看在那些处理上面耗时多再想办法优化吧。

int idColumn = cur.getColumnIndex(Contacts._ID);
int displayNameColumn = cur.getColumnIndex(Contacts.DISPLAY_NAME);
int smartColumn = cur.getColumnIndex("smart");
int lookupColumn = cur.getColumnIndex(Contacts.LOOKUP_KEY);
类似的定义是否可以放到函数开始,没必要定义到循环内部吧,这个具体是否有影响我也不清楚,或许吧。

if (phones != null && phones.moveToNext())
这判断是不是可以改成嵌套形式的,没必要每次都判断phones != null

根据你的代码可以推测你大概的目的,感觉逻辑上没有太大的优化余地了。
实在达不到要求,就改成非同期更新吧。
尛桀 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 chenkejun 的回复:]
要显示就要有数据。
如果进入应用程序就马上显示出来,就等于需要立刻就能读取出数据。
所以要么等,要么就用延迟更新。
[/Quote]

其实还是我那个查询联系人的方法里面循环太多了!
有没有什么办法可以简化的?
发现要查询号码还需要进行一次联系人的循环!可以不用循环就查询出号码么?
chenkejun 2010-11-02
  • 打赏
  • 举报
回复
要显示就要有数据。
如果进入应用程序就马上显示出来,就等于需要立刻就能读取出数据。
所以要么等,要么就用延迟更新。
尛桀 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dinjay 的回复:]
子线程中去处理list要显示的数据,然后处理完通过handler通知UI更新list
LZ,把你的联系人查询语句贴出来,可以自己通过添加SQL语句的过滤,只获取有用的联系人信息,而不是把联系人的所有信息都取出来。
[/Quote]

有用了你的方案了,不过还是要等,除非做个ProgressDialog提示
不过我想实现的是进入应用程序就可以马上显示出来
ameyume 2010-11-01
  • 打赏
  • 举报
回复
同求解决方案,我用ListView显示音乐列表,有200首音乐,读取显示的就很慢,大约要五六秒钟才能显示出来;而天天动听只要2秒左右就可以全显示出来。
尛桀 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 drsmart 的回复:]
缓存下数据,发现有变动了,再修改数据库
[/Quote]
用什么实现?搜了下找不到!
DrSmart 2010-11-01
  • 打赏
  • 举报
回复
缓存下数据,发现有变动了,再修改数据库
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

80,488

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧