我正在使用一个带有ImageAdapter的Gallery来加载从资源中获取的ImageView,但是我的问题是在我的适配器中传递给getView()方法的convertView始终为空。这意味着每次调用getView()都会创建一个新的ImageView。由于GC不断运行以清除所有已创建但不再使用的ImageView,这导致性能非常糟糕。
这显然是一个已知的bug:Gallery's view cache is broken; never converts views.。
我有两个首选解决方案:1. 在适配器本身处理视图缓存,并处理所有必要的逻辑以正确地重用它们;或者2. 包括我的自定义Gallery小部件并尝试修复它,使其正确返回回收的视图。
我已经开始实现选项一,但很快意识到我不确定如何进行这个操作的所有逻辑。我开始认为选项二可能更容易。
我在这里找到了Gallery小部件的代码:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/widget/Gallery.java 我不完全理解它,但我可以看到它正在调用
这显然是一个已知的bug:Gallery's view cache is broken; never converts views.。
我有两个首选解决方案: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);
在第745行出现了问题的根源(我是凭感觉猜测的)。请问有没有人遇到过这个bug?或者能否指导我如何弄清楚回收站的情况,以便我可以调整此小部件以正常工作?还是建议我可能忽视的一些替代选项。
编辑: 我找到的最佳解决方案是一个名为EcoGallery的实现。唯一能够找到它的地方在线上。要使其工作,您必须将其中每个块放置在项目的正确位置。