【问题标题】:notifyDataSetChanged vs setAdapternotifyDataSetChanged 与 setAdapter
【发布时间】:2013-11-30 14:58:06
【问题描述】:

我知道当我希望适配器显示更新的数据时,使用 notifyDataSetChanged 会更有效。但是,由于我的设计,我每次都在考虑重置适配器,当我需要它来显示新数据时。与使用 notifidatasetChanged 相比,这样的决定会增加多少成本(就执行时间而言)?

【问题讨论】:

  • 你为什么不测量它?
  • 有什么区别?也就是说,当 notifyDataSetChanged 发生时,您不会有效地重置适配器吗?
  • 别这样。如果您的应用要求您这样做,那只是糟糕的设计。

标签: android


【解决方案1】:

有点晚了,但我不喜欢拉格纳的回答,因为它并不能解释一切。

基本上,

myListAdapter.notifyDataSetChanged() 

对比

setListAdapter(new ArrayAdapter(myList));

在性能上将非常相似(notifyDataSetChanged 并不是那么无辜:逐步调试以查看它会触发所有更改观察者 - 底层列表的每个元素 - 以通知他们有关更改)。

在这种情况下,性能不是您所追求的。根据项目的整体结构,两者都可以或多或少地具有可读性/可维护性。但主要区别在于,通过重新创建适配器,您会丢失 现有适配器的状态状态破坏了用户与列表交互的产物——滚动位置、行选择、交互过程中可能引入的变化。

总而言之,如果您的设计建议您应该重新创建和重新分配适配器,您可以保留该实现。更可靠和用户友好的是调用notifyDataSetChange

建议

你应该考虑改变设计。

说得好,但并不总是适用(例如,一个人可能在团队中工作或维护一个应用程序,而他没有控制权/资源来重新实现所有内容)。

【讨论】:

    【解决方案2】:

    由于我的设计

    你应该考虑改变设计。

    这样的决定会增加多少成本(就执行时间而言) 与使用 notifidatasetChanged 相比?

    我不喜欢谈论“有多少内存”“内存泄漏”等,但请把这种情况想象成“正常人”。 p>

    您可以通过建造新房子来想象您的目标。你曾经盖过房子。一切都很好,但后来,你想要一些改变!所以你要做一些改变,例如改变颜色,用新的窗户替换窗户,加入一些庇护所等等,你会做什么?

    你会拆房子吗?还是您只做更改?

    我想这个答案你已经知道了。为什么你不想拆房子,只做改变?

    • 建造新房子的成本太高(如果你不是比尔盖茨的话)
    • 这是在浪费时间(更改会更快且成本更低)

    销毁和分配新适配器也是如此。这是浪费时间,效率极低,并且“至少对我来说不舒服”

    在适配器中进行更改(例如添加新项目、更新旧项目、更改行颜色等)更加高效、干净和快速。 API 已经为您提供了实现它的方法。

    我认为你的设计理念并不正确和高效,你应该回顾一下你最终会做什么。试着想想男人。希望这个答案能让你更清楚。

    【讨论】:

    • @Ahmad 谢谢哥们,像你这样的人对我来说意义重大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多