我在listview中有元素可以根据网络响应改变它们的外观
当网络响应listview项目(或arraylist中的项目)时可能处于不同的索引
我能做什么:
对服务器进行备用api调用,返回列表中的所有项目(以最新的形式),然后在适配器上调用notifyDataSetChanged()
但这似乎是对进程的浪费,对于等效对象搜索arraylist,更新它然后调用notifyDataSetChanged()
是否有办法在适配器中安装类似BroadcastReceiver的东西,可以跟踪启动网络呼叫或服务的适配器项目?如果视图目前没有被回收,任何可能只响应接收器
答案 0 :(得分:0)
很难给出一个确切的答案作为您的最佳方法,因为您所描述的是一个非常高级别的概述。我必须给出同等高水平的答案。希望它有所帮助。
在适配器中搜索给定项目的ArrayList
的方法并不多。一个好主意:
您可以创建一个由ArrayList
支持的自定义适配器,同时也维护Set
个数据。好处是找到一个项目是O(1)但是任何添加或删除都需要你修改两个集合而不是一个......这将导致轻微的减速。对于高度复杂的适配器/列表视图,我个人不得不使用此解决方案一次。它可以经常更新(到了notifyDataSetChanged()
曾经被讨论过的点)令人惊讶的是,维持List
和Set
的速度慢下来并不明显运作良好。
如果您的数据具有某种与之关联的唯一ID,则可以使用类似的方法。在这种情况下,您可以构建Map
数据并使用maps values()
方法获取要用于适配器的List
。使用密钥快速查找和更新所需数据。这可能会比Set
想法更困难,也可能不会更难。此外,如果您可以将数据放入SparseArray
(每个项目具有唯一的int),那么您可以使用SparseArrayAdapter来获取O(log n)搜索时间。当然,您无法以任何有意义的方式对数据进行排序。
我不确定BroadcastReceiver
这个想法的可行性。我会看到它更像每个项目的对象实例将控制自己的网络请求/响应,但这看起来很棘手和奇怪。始终可以选择使用CursorAdapter
。只需将所有数据存储到DB。让网络呼叫更新数据库,然后可以在CursorAdapter
。