Java 具有实时传感器更新的android listview

Java 具有实时传感器更新的android listview,java,android,eclipse,listactivity,listadapter,Java,Android,Eclipse,Listactivity,Listadapter,我正在开发一个在列表视图中显示某些位置的应用程序。在每个listview项中都有一个箭头指向该位置(酒店、酒吧等) 问题是我不知道如何有效地更新这个箭头,而不在本地兑现视图(根据谷歌I/O视频,这是我永远不应该做的事情) 每次手机方位传感器事件(每秒多次)时,都需要更新箭头 那么,有没有比对每个事件调用notifyDataSetChanged()并重新填充每个列表项数据更好的方法呢 更新(适用于@dharan和任何感兴趣的人): 我已经停止了这个项目的工作,因为我现在有一份全职工作,但我想到了一

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

问题是我不知道如何有效地更新这个箭头,而不在本地兑现视图(根据谷歌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的问题是,如果一个项目改变了其大小,那么所有内容(即所有子项)都必须进行中继。因此,触发一个项目的更改也可以重新触发布局中的其他内容。现在,因为您正在更改指南针,所以您可以绕过它,因为这不应导致每行更改其总体大小。你只需要重新粉刷那件物品


另一种选择是编写自己的布局,这需要走一些捷径,做出一些通用布局经理无法做到的假设。最后一件事是notifyDataSetChanged()在封面下的作用。您可能可以扩展ListView并编写一个只重绘更改的行的方法(当然,这假定行的高度没有更改)。如果行高发生变化,则该行之后的所有内容都必须中继出去。

要从
列表视图中的行更新
视图
,必须使用
notifyDataSetChanged()
,因此您没有任何选择。关于
ListView
+每秒多次调用
notifyDataSetChanged
的部分听起来不太好。谢谢你的建议,我会有很多项目,所以我不认为我应该使用LinearLayout。我读了一些书,突然想到用BaseAdapter代替ArrayAdapter,你能给我一些建议吗?我不期待的部分是实现ListAdapter和适配器接口。另外+1oh和行的高度永远不会改变,因为我只需要在固定尺寸的ImageView中旋转图像,其他一切都保持不变。对。如果继续使用ListView,则需要创建BaseAdapter的子类。子类化并不难。更难的是实现您需要的快速更新过程。如果您可以访问要更新的行的实例,则对其调用invalidate(),该实例应在不再次执行布局的情况下重新绘制该行。再次考虑后,您可以尝试使用良好的旧方式notifyDataSetChanged()。我目前正在构建一个音乐应用程序,我的应用程序中有一些地方,在列表中,我正在使用notifyDataSetChanged()显示下载或播放的音乐,以更新UI,并且它运行良好。现在我更新的频率不会超过1秒,但这会给你很好的反馈,同时让CPU休息一下。在逐一重画每个元素之前,我会尝试一下。也许你是对的,过早的优化是万恶之源,我会用适配器中当前显示的位置标记一个视图,我会知道其他视图何时显示正确的信息,并且只重绘我的箭头