我正在开发一个应用程序,它在列表视图中显示了一些位置。在每个列表查看项目中,有一个箭头指向该地方(酒店、酒吧等)。
问题是,我不知道如何有效地更新这个箭头,而不需要在本地兑现视图(根据Google /O视频,这是我永远不应该做的事情)。
箭头需要更新的每一个电话方向传感器事件,这是多次每秒。
那么,有比对每个事件调用notifyDataSetChanged()和重新归档每个列表项数据更好的方法吗?
更新(用于@dharan和任何感兴趣的人):
我已经停止了这个项目的工作,因为我现在有一个全职工作,但我想到了一个解决方案(未实现/未经测试)。
首先将旋转角度限制在一个固定的步长上(例如: 5,10,15,20,…355,360),然后缓存每个旋转角度的旋转图像,以避免昂贵的图像旋转计算(但以较高的存储成本)。
之后,我将使我的getView()方法知道何时只更新图像,而不是所有数据。就我的情况而言,这很容易做到:
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView != null && place[position].id == (Integer)convertView.getTag()){
//the place information is already set correctly so just update the image
}
...
}经过这些修改后,我认为调用notifyDataSetChanged()不应导致严重的性能问题。
发布于 2012-05-28 19:29:44
如果ListView中没有太多的项,则可以转换为使用普通的LinearLayout并单独控制这些项。然而,LinearLayout的问题是,如果一个项目改变了它的大小,那么所有的东西(都是子的)都必须被转发出去。因此,触发一个项目中的更改也可以重新触发其他东西来布局。现在,因为你改变了指南针,你可以绕过它,因为这不应该导致每一行改变它的整体大小。你只需要重新粉刷一下那件东西。
另一种选择是编写您自己的布局,这需要一些捷径,做出一些通用布局管理器无法做到的假设,我最不可能看到的是notifyDataSetChanged()在封面下做了什么。您可能可以扩展ListView并编写一个只重绘已更改的行的方法(当然,这假定行的高度没有改变)。如果行高发生变化,那么该行之后的所有内容都必须中继出去。
https://stackoverflow.com/questions/10665380
复制相似问题