我正在开发一个在列表视图中显示某些位置的应用程序。在每个列表视图项中,都有一个指向该地点(酒店,酒吧等)的箭头。

问题是我不知道如何在不兑现本地视图的情况下有效地更新此箭头(根据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中没有太多项目,则可以转换为使用普通的LinearLayout并分别控制这些项目。但是,LinearLayout的问题是,如果项目更改其大小,则所有内容(即所有子项)都必须中继出去。因此,触发一项更改会同时触发其他内容以重新布局。现在,由于您要更换罗盘针,因此您可能可以在其周围打滑,因为这不会导致每一行都改变其整体大小。您只需要重新粉刷该项目。

另一个选择是编写自己的布局,该布局需要一些捷径,并做出一些通用布局管理器无法做到的假设。我可能要看的最后一件事是notifyDataSetChanged()在后台进行的操作。您也许可以扩展ListView并编写一个仅重绘已更改行的方法(当然,这假定行的高度未更改)。如果行高发生变化,则必须中继出该行之后的所有内容。

07-28 12:17