我有一个Gallery,它有一个适配器连接到它。在getView方法中,我有一个自定义布局,以便我可以将图像和标题一起显示
图像是从URL下载的,该URL是异步完成的,并按预期工作。
目前我让每个项目都填满了屏幕,所以我一次只显示一个项目,基本上我想让它像幻灯片一样。
让我说清楚,目前我有一个活动,它只有一个视图,这是一个图库。
当我滑动时出现问题,图像反弹并保持在同一图像上。我需要刷多次,坚硬,长时间滑动,然后我可以进入下一个图像。
我在getView()中的自定义适配器中放置了一条调试消息,似乎getView被多次调用(4次),并且传递的位置是当前位置还是前一位置,这解释了为什么我是卡在同一个屏幕上。
如果我删除远程下载图像部分,或者只是使用手机中的静态图像,我没有任何其他问题,事实上,getView只会被调用一次,位置正确。
我非常沮丧,不知道问题是什么,可能是因为我正在异步下载图像,这将导致图像更新导致getView再次被调用以重绘自身? 我不确定..
请帮助
答案 0 :(得分:2)
不幸的是,这是一个库的错误。无论异步更新数据,Listviews都会很好地滚动。但是,图库的编码与listview不相符
当图库尝试更新可见视图时(由于您的图片加载回调),此视图将" snap"回到焦点位置。如果您在滚动时以任何方式更改视图,它将会捕捉。这可能是您必须滚动以远离当前视图的原因。它正在尝试在您的视图上执行回调,并且仅在您远离该视图之前仅快速滚动将阻止回调发生。
我刚才在这里报告了这个问题: Android Issues 如果您使用图库设置,可以尝试在此处发布一些解决方法。
不幸的是,它还没有引起Android开发者的注意。 似乎问题是由于视图被设置为" wrap_content"并且画廊必须重新测量/重绘其观点
我已经从使用图库迁移而不是使用ViewPager。管理起来要容易得多,您不必担心这个问题。自从Gallery首次推出以来,这一直是Gallery的一个已知问题。我不知道这是否在任何较新的Android版本(3.x / 4.x)中得到修复。从2.3.7开始,它没有修复。
答案 1 :(得分:0)
首先你应该注意:任何AdapterView(Gallery,ListView等)都不保证每次调用getView()方法时它都会传递相同的View实例参数。它只保证每个视图具有相同的类型(请参阅Adapter.getIntemViewType()方法文档)
因此,当您开始下载图像时,您应该只指定元素的位置。然后在下载图像后,您应该在Adapter.getView()方法调用中将指定的ImageView与下载的图像绑定。
查看Android示例here
中的ImageDownloader另一种方法是使用WeakHashMap,以便将适配器视图的映射包含到其位置。如果需要,我可以为您提供代码示例。