Listview的ArrayAdapter notifydatasetchanged()非常慢的重绘

时间:2010-09-27 16:12:00

标签: listview android performance android-arrayadapter redraw

我有一个非常简单的列表,每行有3个textview字段。我们使用来自后台webservice调用(AsyncTask)的数据每2秒左右更新一次值

我们将即将到来的值与当前值进行比较,在适配器上相应地更新它们,并在需要时最终调用notifyDataSetChanged()

重要的是重绘得非常慢,因此当我们一次获得3个以上的更新行时,挂起整个UI。当然,我们使用所有ListView众所周知的优化,例如EfficientAdapter方法(setTag()和holder),以及getViewTypecount()/ getItemViewType()。我们还尝试使用layoutopt尽可能地优化我们的界面,并尝试避免wrap_content宽度和高度来减轻负担。

我们不会对我们的更新执行昂贵的操作,只是标准的东西:更改TextView文本,textcolor和backgroundcolor值。

我能看到的唯一奇怪的事情就是每行调用getView()3-4-5次,虽然我已经阅读了所有那些Romain的消息[1]告诉它没有错误

关于如何加快速度的任何想法或提示?

非常感谢!

[1] http://groups.google.com/group/android-developers/browse_thread/thread/4c4aedde22fe4594/aeb04288064f495e?show_docid=aeb04288064f495e

2 个答案:

答案 0 :(得分:1)

这是为那些从谷歌浏览的人认为他们需要重写自己的数据改变方法。根据我的数据,在很多情况下你不需要。

notifyDataSetChanged()可以比您的手动编码替换更快,这完全取决于您实际的listview实施。

示例:一个简单的3行纯文本列表视图,通过菜单选择更新了最大10K行ArrayList

手动notifyDataSetChange()

--- avg run-time: 4ms

默认免费notifyDataSetChange()

--- avg run-time: 0ms <--- you can't get faster than this.

除非你对你的东西进行时间和基准测试,否则不要运行来创建自己的替代品。在必要时使用免费的东西。

答案 1 :(得分:0)

我想你可以设置一个标签给你的textView作为它将从中获取更新的url。而不是调用“notifyDataSetChanged()”,您可以尝试对该视图使用findViewByTag(更新URL)和setText,因此textview只会重复绘制而不是一遍又一遍地重新绘制整个列表。足以减少额外重绘的次数。只是一个想法。