【发布时间】:2012-05-19 12:56:01
【问题描述】:
我正在开发一个在列表视图中显示某些地方的应用程序。在每个列表视图项中都有一个指向该地点(酒店、酒吧等)的箭头。
问题是我不知道如何有效地更新此箭头,而无需在本地兑现视图(根据 Google I/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() 不会导致严重的性能问题。
【问题讨论】:
-
要从
ListView中的一行更新View,您必须使用notifyDataSetChanged(),因此您别无选择。关于ListView+ 调用notifyDataSetChanged的部分每秒很多次听起来不太好。
标签: java android eclipse listactivity listadapter