1

首先,是的,我知道这个问题,但答案对我没有帮助。是的,它解决了“滚动时改变位置”的问题,但它不是我的问题的最佳解决方案。让我解释...

所以,这是我的getView

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    UnscaledImageView imageView;

    if(convertView == null) {
        imageView = new UnscaledImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(mIconSize, mIconSize));
        imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        imageView.setImageResource(mThumbIds[position]);
    } else {
        imageView = (UnscaledImageView)convertView;
    }

    return imageView;
}

常见的解决方案是移到声明imageView.setImageResource(mThumbIds[position]);之外和之下if。但这又产生了一个问题……

您可能已经注意到我使用的是 aUnscaledImageView而不是ImageView. 这是一个自定义子类ImageView,我setImageResource()用一些额外的选项覆盖了手动解码位图的方法以满足我的需求。手动解码是导致我的问题的原因。

如果该setImageResource()方法停留在 内if,没问题,位图解码将完成一次位图(在 GridView 加载期间)并且滚动将是平滑的......但是每次滚动时图像会跳转到不同的位置。

但是如果该setImageResource()方法停留在 之外if,图像不会跳转到不同的位置,但所有图像都会随着每次滚动而不断解码。滚动将是生涩的,根本不流畅。

我该如何解决这个问题?有任何想法吗?

4

1 回答 1

1

也许您可以对解码的图像使用某种缓冲或缓存。你的setImageResource方法应该检查它的输入图像是否已经在缓冲区中(即它是否已经被解码)。如果是这样,那么您的方法只会从缓冲区中检索解码的图像。如果不是,那么它将解码图像并将其存储在缓冲区中以供将来使用。如何实现缓冲区/缓存取决于您自己的需要。我敢肯定有很多可能性。这样,您可以将调用setImageResource移出if-then块,并且不必在每次getView调用该方法时都解码图像。

于 2012-08-27T21:06:44.583 回答