我有一个非常简单的列表,每行有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]告诉它没有错误
关于如何加快速度的任何想法或提示?
非常感谢!
答案 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只会重复绘制而不是一遍又一遍地重新绘制整个列表。足以减少额外重绘的次数。只是一个想法。