【问题标题】:android listview with real-time sensor updates具有实时传感器更新的 android listview
【发布时间】: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


【解决方案1】:

如果您在 ListView 中没有太多项目,您可以转换为使用普通的 LinearLayout 并单独控制这些项目。 LinearLayout 的问题是,如果一个项目改变了它的大小,那么所有的东西(即所有的孩子)都必须被转发出去。因此,触发一项更改也可以重新触发其他内容以进行布局。现在,因为您要更换指南针,您可能可以绕过它,因为这不会导致每一行都改变其整体尺寸。您只需要重新绘制该项目。

另一种选择是编写自己的布局,该布局采用一些捷径,做出一些通用布局管理器无法做到的假设。我可能会看到的最后一件事是 notifyDataSetChanged() 在幕后做了什么。您也许可以扩展 ListView 并编写一个仅重绘已更改行的方法(当然这假设行的高度没有更改)。如果行高发生变化,那么该行之后的所有内容都必须转发。

【讨论】:

  • 谢谢你的建议,我会有很多项目所以我认为我不应该使用LinearLayout。我已经阅读了一些内容,并遇到了使用 BaseAdapter 而不是 ArrayAdapter 的想法,我可以请您提供意见吗?我不期待的部分是实现 ListAdapter 和 Adapter 接口。也 +1
  • 哦,行的高度永远不会改变,因为我只需要在具有固定尺寸的 ImageView 中旋转图像,其他一切都保持不变。
  • 对。如果您继续使用 ListView,您将需要创建 BaseAdapter 的子类。子类化并不难。更难的部分是实施您需要的快速更新过程。如果您可以访问要更新的行的实例,则在其上调用 invalidate() 应该重绘它而无需再次执行布局。
  • 再三考虑,您可能只是尝试使用良好的老式 notifyDataSetChanged()。我目前正在构建一个音乐应用程序,我在我的应用程序中有一些地方,在列表中我正在使用 notifyDataSetChanged() 来显示音乐下载或播放以更新 UI,并且它表现良好。现在我更新的频率不会超过 1 秒,但这会给你很好的反馈,同时让 CPU 休息一下。在走上单独重绘每个元素的艰难道路之前,我会先尝试一下。
  • 也许你是对的,过早的优化是万恶之源,我将用它当前显示的适配器中的位置标记视图,我会知道其余视图何时显示正确的信息,只重绘我的箭头
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多