1

在我的 GridView 的 getView() 方法中,我正在执行以下操作:

public View getView(int position, View convertView, ViewGroup parent) {
       convertView = this.inflater.inflate(..);
       ImageView image = (ImageView) convertView
                .findViewById(R.id.imageButton1);
       imageLoader.displayImage("URL/"
                + sampleArray.get(position), image);

这里的 sampleArray 是我在创建 Adapter 时加载的数组。它在延迟加载(使用此工具:https ://github.com/nostra13/Android-Universal-Image-Loader )这些图像时使用,并且基本上是确定要加载的图片的图像 URL 的一部分。现在,据我所知,最好的做法是仅在视图为空时才对视图进行膨胀:

if(convertView == null){
   this.inflater.inflate(...);

当我这样做时,它实际上更快,但图像加载很奇怪。如果我向下滚动并向上滚动,图像会在行内切换,这意味着在顶行中,第一列图像可能会与第二列图像随机切换。我使用的数组 (sampleArray) 没有改变。我知道这与调用位置和 getView() 有关,但我不确定为什么会发生这种行为。

如果我按照现在的方式(第一个代码块)进行操作,这意味着我每次都会对其进行充气,它可以完美运行,但加载速度很慢。为什么这种行为会这样工作?

提前致谢。

编辑

这就是我认为正在发生的事情。GetView() 被多次调用,这与“位置”参数不同步,导致从数组中挑选出错误的元素。我仍然对此感到困惑。

4

2 回答 2

0

你应该使用

.resetViewBeforeLoading()

并且可能

.showStubImage(R.drawable.empty_image)

初始化 UIL 时在 DisplayImageOptions 上。这将在加载之前重置视图。这是必需的,因为您正在重用 gridview 上的视图。

于 2013-02-26T09:51:58.870 回答
0

您是否尝试过清理原始图像:

image.setImageBitmap(null);

我检查了图像加载器的源代码,其中一种方法是:

public void displayImage(String uri, ImageView imageView, DisplayImageOptions options) 

我认为您也可以尝试将选项设置为“resetViewBeforeLoading = true”

我认为奇怪的事情发生的原因是,在加载器将其与新位图附加之前,该视图被 gridview 回收,该视图在显示时仍与原始位图保持一致。

如果它仍然不起作用,请让我知道。

编辑

我做了更多的调查,我认为原因是回收。让我更清楚地解释一下:

原因:

假设屏幕上的数据共有 12 个单元格,则只有 9 个视图可见

一开始,gridview 将创建并在屏幕上显示 9:

视图_1_1 视图_1_2 视图_1_3

视图_2_1 视图_2_2 视图_2_3

view_3_1 view_3_2 view_3_3

滚动后(向上滚动,显示第 4 行),此时网格视图会将 view_1_1、view_1_2、view_1_3 放入回收站。然后将从回收站获取第 4 行的 3 个视图,这些视图作为“convertView”放入 getView,因此 view_1_1、view_1_2、view_1_3 将被重用。

假设一开始,视图附有位图

view_1_1:位图_1_1

view_1_2:位图_1_2

view_1_3:位图_1_3

当这些视图被回收并显示在第 4 行时,由于位图是异步加载的,因此 bitmap_1_1、bitmap_1_2、bitmap_1_3 将显示在第 4 行,然后被这些新位图替换。

如何确认

1.我喜欢的调试网格视图的一种方法是在图像上放一些“id”,简单的方法就是在“ImageView” toString() 上放一个覆盖视图,并在其中写入id,例如:

String s = viewInfoHolder.imageView.toString();
viewInfoHolder.overlay.setText(s.substring(s.length() -3));//last 3 chars are enough and cleanup

2.为了使更换变慢,修改

com.nostra13.universalimageloader.core.LoadAndDisplayImageTask

方法的最后一行:

public void run() 

从:

handler.post(displayBitmapTask);

至:

handler.postDelayed(displayBitmapTask, 2000);

您可以准确了解网格视图的工作原理。

希望它有帮助:)

于 2013-01-24T03:43:12.157 回答