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

Android 如何防止GridView图像在滚动时改变位置?,android,bitmap,android-imageview,decoding,android-gridview,Android,Bitmap,Android Imageview,Decoding,Android Gridview,首先,是的,我知道这一点,但答案对我没有帮助。是的,它解决了“滚动时改变位置”的问题,但它不是解决我问题的最佳方案。让我解释一下 因此,这是我的getView: @Override public View getView(int position, View convertView, ViewGroup parent) { UnscaledImageView imageView; if(convertView == null) { imageView = new

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

因此,这是我的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
之外,图像将不会跳转到不同的位置,但所有图像将在每次滚动时不断解码滚动将不平稳。


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

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

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

可能是这样的吗?是的,这是android上捕捉位图的标准方法。但具体的实现取决于您自己,并取决于应用程序的需要。您可能需要实现复杂但非常高效的东西,或者需要实现简单(如位图数组)但效率不高的东西。鲁卡什似乎是一个很好的起点。事实上,我打算在我自己的应用程序上试试:-)也许是这样的?是的,这是在android上捕捉位图的标准方法。但具体的实现取决于您自己,并取决于应用程序的需要。您可能需要实现复杂但非常高效的东西,或者需要实现简单(如位图数组)但效率不高的东西。鲁卡什似乎是一个很好的起点。事实上,我将在我自己的应用程序上尝试:-)