更新列表视图单元格/索引可能更改的项目

时间:2014-10-09 15:45:34

标签: android listview arraylist broadcastreceiver baseadapter

我在listview中有元素可以根据网络响应改变它们的外观

当网络响应listview项目(或arraylist中的项目)时可能处于不同的索引

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

但这似乎是对进程的浪费,对于等效对象搜索arraylist,更新它然后调用notifyDataSetChanged()

的替代方法也是如此。

是否有办法在适配器中安装类似BroadcastReceiver的东西,可以跟踪启动网络呼叫或服务的适配器项目?如果视图目前没有被回收,任何可能只响应接收器

1 个答案:

答案 0 :(得分:0)

很难给出一个确切的答案作为您的最佳方法,因为您所描述的是一个非常高级别的概述。我必须给出同等高水平的答案。希望它有所帮助。

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

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

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

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

中反映出来