我知道当我希望适配器显示更新的数据时,使用notifyDataSetChanged会更有效。但是,由于我的设计,我想每次重置适配器,当我需要它来显示新数据时。与使用notifidatasetChanged相比,这样的决定会增加多少成本(就执行时间而言)?
答案 0 :(得分:10)
由于我的设计
你应该考虑改变设计。
这样的决定会增加多少成本(就执行时间而言) 与使用notifidatasetChanged相比?
我不喜欢谈论“多少内存”,“内存泄漏”等等但请将这种情况想象为“正常人”。
您可以通过建造新房来形象。你曾经建造过房子。一切都好,但后来,你想要一些改变!所以你要做一些改变,例如改变颜色,用新的替换窗户,加入住房等等,你会做什么?
你会拆毁房子吗?或者你只会做出改变?
我认为你已经知道答案了。为什么你不想拆除房子而只是做出改变?
同样是破坏和分配新的适配器。这是浪费时间,最大限度地低效,“至少对我来说不舒服”。
在适配器中进行更改(如添加新项目,更新旧项目,更改行颜色等)更高效,更干净,更快捷。 API已经为您提供了如何实现它的方法。
我认为你的设计理念不正确和有效,你应该回顾一下你最终会做什么。试着想想男人。希望这个答案能让你更清楚。
答案 1 :(得分:8)
有点晚了,但我不喜欢Ragnar的回应,因为它并不能解释所有事情。
基本上,
myListAdapter.notifyDataSetChanged()
vs
setListAdapter(new ArrayAdapter(myList));
在性能上几乎相似(notifyDataSetChanged
并非完全无辜:逐步调试以查看它触发所有更改观察者 - 基础列表的每个元素 - 通知他们有关更改的信息)
在这种情况下,性能不是您所追求的。根据项目的整体结构,两者都可以或多或少地具有可读性/可维护性。但主要的区别在于,通过重新创建适配器,您将失去现有的状态。 State 破坏了用户与列表交互的产物 - 滚动位置,行选择,交互过程中可能引入的更改。
总而言之,如果您的设计建议您重新创建并重新分配适配器,那么您可以保留该实现。更可靠和用户友好的是调用notifyDataSetChange
。
善意的建议
你应该考虑改变设计。
很高兴但是并不总是适用(例如,一个人可能在团队中工作或维护一个他无法控制/资源来重新实现所有内容的应用程序。)