滚动时如何防止GridView图像改变位置?

时间:2012-08-27 18:05:03

标签: android bitmap android-imageview decoding android-gridview

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

所以,这是我的 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语句之外和之下。但这造成了另一个问题......

您可能已经注意到我使用的是UnscaledImageView而不是ImageView。这是ImageView的自定义子类,我在其中重写了setImageResource()方法,手动解码位图,并提供了一些额外的选项以满足我的需求。手动解码是造成我问题的原因。

如果setImageResource()方法保留在if内,没问题,位图解码将针对位图进行一次(在GridView加载期间)并且滚动将是平滑的...... 但每个卷轴都会跳转到不同的位置。

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

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

1 个答案:

答案 0 :(得分:1)

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