我正在开发一个在列表视图中显示某些地方的应用。在每个listview项目中都有一个指向该地方的箭头(酒店,酒吧等)。
问题是我不知道如何有效地更新此箭头,而无需在本地兑换视图(根据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()不会导致严重的性能问题。
答案 0 :(得分:2)
如果ListView中没有太多项目,您可以转换为使用普通的LinearLayout并单独控制这些项目。但是,LinearLayout的问题是,如果某个项目的大小发生变化,那么所有内容(即所有子项)都必须被中继。因此,触发一个项目的更改也可以重新触发其他布局。现在,因为你正在更换罗盘针,你可以绕过它,因为这不应该导致每一行改变它的整体尺寸。你只需要重新绘制该项目。
另一个选择是编写自己的布局,采取一些捷径,做出一些假设,通用布局管理器不能。我可能会关注的最后一件事是notifyDataSetChanged()做了什么。您可以扩展ListView并编写一个只重绘已更改行的方法(当然这假设行的高度没有改变)。如果行高度发生变化,那么该行之后的所有内容都必须被中继。