【问题标题】:update listview cells/items whose index may change更新索引可能更改的列表视图单元格/项目
【发布时间】:2014-10-09 15:45:34
【问题描述】:

我在列表视图中有一些元素可以根据网络响应改变它们的外观

到网络响应时,列表视图项(或数组列表中的项)可能位于不同的索引处

我能做什么: 对服务器进行备用 api 回调,返回列表中的所有项目(以最新的形式),然后在适配器上调用 notifyDataSetChanged()

但这似乎是对进程的浪费,因此在数组列表中搜索等效对象、更新它然后调用notifyDataSetChanged()

有没有办法让适配器中的广播接收器之类的东西可以跟踪启动网络调用或服务的适配器项目? any 可能仅在视图当前未回收时才响应接收者

【问题讨论】:

    标签: android listview arraylist broadcastreceiver baseadapter


    【解决方案1】:

    很难给出一个准确的答案作为您的最佳方法,因为您所描述的是一个非常高层次的概述。我将不得不给出同样高水平的答案。希望对您有所帮助。

    在适配器中为给定项目搜索ArrayList 的方法并不多。一个好主意:

    您可以创建一个由ArrayList 支持的自定义适配器,但也可以维护数据的Set。好处是找到一个项目是 O(1) 但是任何添加或删除都需要您修改两个集合而不是一个......这将导致稍微慢下来。对于高度复杂的适配器/列表视图,我个人不得不使用此解决方案一次。它可能会经常更新(曾经讨论过限制notifyDataSetChanged())令人惊讶的是,维护ListSet 的速度几乎不明显,整体运行良好。

    如果您的数据具有与之关联的某种唯一 ID,您可以使用类似的方法。在这种情况下,您可以构建数据的Map 并使用映射values() 方法来获取List 以用于适配器。同时使用按键快速查找和更新所需数据。这可能会或可能不会比Set 的想法更困难。此外,如果您可以将数据放入SparseArray(每个项目都有一个唯一的int),那么您可以使用SparseArrayAdapter,它可以获得O(log n)搜索时间。当然,您失去了以任何有意义的方式对数据进行排序的能力。

    我不确定BroadcastReceiver 的想法是否可行。我会看到它更像是每个项目的对象实例会为自己控制网络请求/响应,但这似乎很棘手和奇怪。始终可以选择使用CursorAdapter。只需将所有数据存储到数据库即可。让网络调用更新数据库,然后可以在CursorAdapter 中反映出来。

    【讨论】:

      猜你喜欢
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      相关资源
      最近更新 更多