Gallery ImageAdapter convertView始终为null

Foa*_*Guy 14 android view widget gallery convertview

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

这显然是一个已知的错误:Gallery的视图缓存已被破坏; 从不转换观点..

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

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

我在这里找到了Gallery小部件的代码: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);
Run Code Online (Sandbox Code Playgroud)

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

有没有人有这个bug的经验.或者,任何人都可以指出我正确的方向,以确定回收器的情况如何工作,以便我可以调整这个小部件以正常工作?或者甚至提出一些我可能会忽略的替代选项.

编辑:我找到的最佳解决方案是一个名为EcoGallery的实现.我可以在网上找到它唯一可以参考的地方就在这里.要使其正常工作,您必须将每个块放在项目中的正确位置.

dsk*_*ner 3

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

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

[V1, V2, V3]
Run Code Online (Sandbox Code Playgroud)

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

[V2, V3, V1]
Run Code Online (Sandbox Code Playgroud)

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

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