【问题标题】:Android Gallery View and adapter getView gets called many timeAndroid Gallery View 和适配器 getView 被多次调用
【发布时间】:2012-02-22 17:40:50
【问题描述】:

我有一个画廊,它有一个连接到它的适配器。在 getView 方法中,我有一个自定义布局,这样我就可以同时显示图像和标题

图像是从一个 URL 下载的,这是异步完成的,并且可以按预期工作。

目前我让每个项目都填满屏幕,所以我一次只显示一个项目,基本上我想让它像幻灯片一样。

让我说清楚,目前我有一个活动,它只有一个视图,即画廊。

当我滑动时出现问题,图像弹跳并停留在同一图像上。我需要多次滑动,用力和长时间滑动,然后我才能进入下一张图片。

我在 getView() 的自定义适配器中放了一条调试消息,似乎 getView 被调用了很多次(4 次),并且传递的位置是当前位置或前一个位置,这解释了我为什么卡在同一个屏幕上。

如果我删除远程下载图像部分,或者只是使用手机中的静态图像,我没有任何问题,事实上,getView 只被调用一次,位置正确。

我很沮丧,不知道是什么问题,可能是因为我正在异步下载图像,这会导致图像更新导致再次调用 getView 以重绘自身? 我不确定..

请帮忙

【问题讨论】:

  • 我们需要一个代码示例来帮助您。

标签: android image view gallery adapter


【解决方案1】:

不幸的是,这是画廊的一个错误。无论数据是否异步更新,Listview 都会很好地滚动。但是,画廊只是没有编码到与列表视图相提并论的水平

当图库尝试更新可见视图时(由于您的图像加载回调),此视图将“快速”回到焦点位置。如果您在滚动时以任何方式更改视图,它将捕捉。这可能就是您必须努力滚动才能离开当前视图的原因。它正在尝试对您的视图执行回调,并且只有快速滚动才能防止在您离开该视图之前发生回调。

我不久前在这里报告了这个错误: Android Issues 如果您打算使用图库,则可以尝试其中发布了一些解决方法。

很遗憾,它没有引起 Android 开发者的关注。 看来问题是由于视图设置为“wrap_content”而画廊不得不重新测量/重绘其视图

此后,我不再使用图库,而是使用 ViewPager。它更容易管理,您不必担心这个问题。自从画廊首次推出以来,这一直是画廊的一个已知问题。我不知道这是否已在任何较新的 Android 版本(3.x/4.x)中得到修复。从 2.3.7 开始,它不是固定的。

【讨论】:

  • 谢谢您,先生...您又救了我一天...我已经调试了 2 天。你能推荐我任何其他可以存档幻灯片的视图吗?ViewPage 是否可以让你看到当前项目和下一个项目之间的“过渡”?我只是在看 ViewFlipper,我不确定 ViewPage 是否更好或 ViewFliper 是否适合我的需要......
  • 使用 ViewPager。它可以让您一次在一个视图之间“滑动”。它会预加载下一个和(取决于您从哪里开始)以前的视图,以便过渡无缝流畅。
  • 太糟糕了,我无法支持 ViewPager 的 API 级别..也..您如何看待 rus1f1kat0R 的答案?
  • 问题是...如果我使用要下载的相同图像,但将其静态存储,即在我的可绘制文件夹中,我可以毫无问题地滚动...就在下载远程图像时,一切都搞砸了..
  • 他的回答将验证当您的回调尝试将您的图像加载到视图中时,它会加载到正确的视图中。前任。您在加载之前将视图滚动到屏幕外。在您向后滚动之前,该图像不会显示。如果您不管理应该包含图像的视图,您最终将无序地显示图像。 .
【解决方案2】:

首先您应该注意:任何 AdapterView(Gallery、ListView 等)都不能保证每次调用 getView() 方法时都会传递相同的 View 实例参数。它只保证每个视图都具有相同的类型(请参阅Adapter.getIntemViewType() 方法文档)

因此,当您开始下载图像时,您应该只指定元素的位置。然后在图像下载完成后,您应该在 Adapter.getView() 方法调用中将指定的 ImageView 与下载的图像绑定。

查看 Android 示例中的 ImageDownloader here

另一种方法是使用 Wea​​kHashMap 来包含适配器视图到其位置的映射。如果您需要,我可以为您提供代码示例。

【讨论】:

  • 我的图片下载器已经基于你提供的 URL...我不确定你的段落在这里“所以,当你开始下载图片时,你应该只指定元素的位置。然后在图片已下载,您应该在 Adapter.getView() 方法调用中将指定的 ImageView 与下载的图片绑定。"
  • 我通过坚持使用图库视图解决了这个问题......我的解决方法是缓存图像而不是按需下载
猜你喜欢
  • 1970-01-01
  • 2014-11-04
  • 2011-06-28
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多