android - Gallery ImageAdapter convertView 始终为空

标签 android view widget gallery convertview

我正在使用带有 ImageAdapter 的 Gallery 加载它,并使用 ImageViews 从我的资源中提取图像。我的问题是在我的适配器中传递给 getView() 方法的 convertView 始终为 null。这意味着每次调用 getView() 时都会创建一个新的 ImageView。这会导致糟糕的性能,因为 GC 不断运行以清除所有这些已创建且不再使用的 ImageView。

这显然是一个已知错误:Gallery's view cache is broken; never converts views. .

我的两个首选解决方案是 1. 在适配器本身中处理 View 缓存,并处理正确重用它们所需的所有逻辑。 或 2. 包含我自己的 Gallery 小部件副本并尝试修复它,以便它正确返回回收 View 。

我已经开始实现选项一,但很快意识到我并不完全了解如何制定该操作背后的所有逻辑。我开始认为选项二可能更容易。

我在这里找到了图库小部件的代码:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/widget/Gallery.java

没完全看懂,但能看出是在调用

child = mAdapter.getView(position, null, this);

第 745 行。我(在黑暗中拍摄)猜测这是问题的根源。

有没有人遇到过这个错误。或者任何人都可以指出正确的方向来弄清楚回收站的情况是如何工作的,以便我可以调整这个小部件以使其正常工作吗?或者甚至提出一些我可能忽略的替代选项。

编辑:我发现的最佳解决方案是名为 EcoGallery 的实现。我唯一能找到引用的地方online anymore is here .要使其正常工作,您必须将其中的每个 block 放在项目中的正确位置。

最佳答案

没有特别处理该错误的经验,但我之前使用第 3 方 View 寻呼机(在支持库之前)完成了自定义缓存。

老实说,这真的不是太难。就我而言,我知道屏幕上最多只有一项。但我也希望预加载左侧和右侧的项目(这些是从网上提取数据的 webview)。所以我有一个包含 3 个 View 的简单数组。

[V1, V2, V3]

现在您唯一需要做的就是将适配器中的位置与缓存中的位置相关联。有多种方法可以解决这个问题。当我第一次将它突出显示时,我只是将我当前的 View 设为 V2,并在翻转寻呼机时旋转数组的项目。所以翻到下一个 View 会改变我的数组

[V2, V3, V1]

很容易跟上。或者您可以只做数学运算并计算缓存的相对位置。

另一种方法是创建一个后进先出队列。通过将 View 插入队列来回收 View ,当您需要 View 时,只需从中弹出一个 View 即可。

关于android - Gallery ImageAdapter convertView 始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7729853/

相关文章:

Android SDK 安装失败 - 连接重置。什么都没有安装

android - WebView 抛出 “Unknown chromium error: 0”

android - 动态设置背景颜色

c++ - Qt:没有性能问题的(自定义)QWidget 列表

c++ - 如何使用 Qt 4.8 在 Windows 中单击按钮时获得主窗口和小部件的不透明度?

java - Eclipse The import org.hibernate 无法解析

javafx - Tornadofx onFocus监听器

c# - MVC3 在 1 个 View 中显示来自 1 个以上实体的信息

java - 无法在 Activity 内调用 View 对象的方法

android - 如何在使用支持库时构建带有 ListView 的 AppWidget?