我有一个非常令人沮丧的问题,我不知道出了什么问题。 我构建了仅包含GridView的简单XML。此gridview应显示从特定URL下载的图像(ImageView),我用我的代码检索。
所以这个APP的想法只是从URLS下载图像并在GridView中显示这些图像。首先,我必须说我正在使用Universal Image Loader库。首先请看我的getView代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView iv;
if(convertView == null) {
iv = new ImageView(MyActivity.this);
iv.setLayoutParams(new GridView.LayoutParams(size,size));
iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
Log.d("APP", "convertView is NULL");
}
else {
iv = (ImageView) convertView;
Log.d("APP", "convertView is NOT null");
}
loader.displayImage(URLS.get(position), iv);
return iv;
}
问题:
上面的代码工作,它在GridView中显示图像。但是当我向下滚动时,我看到了:
我如何解决这个问题:
我通过NOT检查convertView变量是否为null来解决了这个问题。实际上我省略了if / else子句。
我在memory = true中使用了cache。因此,下载停止和图像永远存在。
那我为什么要求帮助呢?主要是因为我知道我不应该因为性能原因而忽略if / else子句。我不想弄乱用户内存,我想为他们带来快速可靠的用户体验。我也想知道可能出现的问题。
谢谢你的帮助。非常感兴趣。
答案 0 :(得分:1)
Loader需要一些时间来加载ImageView
中的图片。因为您为不同的图像重复使用视图,所以在加载新图像时可以在视图中看到上一个图像。您可以在resetViewBeforeLoading(true)
中设置DisplayImageOptions
以避免此影响。
此外,您可以使用磁盘缓存来避免每次从网络下载图像。还限制了内存缓存的大小并设置了其他设置,但我认为内存缓存很有用,它可以改善用户体验。
并且不要忘记使用setOnScrollListener(new PauseOnScrollListener(loader, true, true))
来避免滚动滞后。
答案 1 :(得分:0)
为了提高性能,GridView会回收列表项。所以当你滚动时,列表项会在不同的地方被回收,然后你的代码会重新填充它们。有时这会滞后于图像。
我建议使用一个处理类似Picasso的东西的库。
答案 2 :(得分:0)
我遇到了与你完全相同的问题,并且也不想禁用convertView检查。 我的解决方案是增加ImageLoaderConfiguration中的内存缓存大小。
之前,我曾经这样使用它:
.memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))
所以我改成了:
.memoryCache(new UsingFreqLimitedMemoryCache(10 * 1024 * 1024))
我不知道10 * 1024 * 1024是否太多或者会造成任何问题,但它似乎已经解决了我的问题,直到现在我还没有遇到任何问题。