【问题标题】:How to prevent GridView images from changing position when scrolling?如何防止 GridView 图像在滚动时改变位置?
【发布时间】:2012-08-22 05:53:01
【问题描述】:

首先,是的,我知道这个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 之外,图像不会跳转到不同的位置,但所有图像都会随着每次滚动而不断解码。 滚动会很生涩,一点也不流畅。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是的,这是在 android 上捕获位图的标准方法。但具体的实现取决于您,取决于您的应用程序的需求。您可能需要具有复杂实现但非常高效的东西,或者具有简单实现(如位图数组)但效率不高的东西。 Lrucache 似乎是一个很好的起点。事实上,我打算在我自己的应用程序上尝试一下 :-)
    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2017-05-25
    • 2012-12-04
    • 1970-01-01
    相关资源
    最近更新 更多