我有来自互联网的文本和大图像的ListView。我的图片项具有适合宽度和wrap_content
高度
我试图用UIL
& Picasso
。它们都可以工作,但是当我停止滚动时图像总是重新加载,它使ListView闪烁
它看起来像这样:
当我停止滚动时(我向下滚动然后向上滚动),您可以看到重新下载已下载和缓存的图像。
我该如何防止这种情况发生?
<ImageView android:id="@+id/imgFeed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="centerCrop"/>
// UIL
options = new DisplayImageOptions.Builder()
.showImageOnLoading(defaultImage)
.showImageOnFail(defaultImage)
.showImageForEmptyUri(defaultImage)
.resetViewBeforeLoading(false)
.cacheOnDisk(true).delayBeforeLoading(0)
.displayer(new FadeInBitmapDisplayer(200)).cacheInMemory(true).imageScaleType(ImageScaleType.EXACTLY_STRETCHED).build();
ImageAware imageAware = new ImageViewAware(viewHolder.imgFeed, false);
ImageLoader.getInstance().displayImage(item.getPhotoUrl(), imageAware, options);
// Picasso
Picasso.with(getContext())
.load(item.getPhotoUrl())
.placeholder(R.drawable.place_holder_big)
.resize(screenWidth, 0) //set max width
.into(viewHolder.imgFeed);
对于UIL,我在this issue尝试了很多方法,但它们根本不适合我。
更新:我似乎遇到了像this question这样的内存缓存问题。但是我该如何解决这个问题呢?看看Facebook应用程序,他们做得非常好。所有图像都有不同的尺寸,适合的宽度,非常平滑的滚动,无需重新加载图像。他们怎么能这样做?
答案 0 :(得分:4)
如果您想知道Facebook是如何做到的,他们实际上发布了他们的图片加载库(https://github.com/facebook/fresco)
您当时是否有可能在底层ListView上调用notifyDataSetChanged?你还在使用hasStableIds()吗?
对于UIL,您可以尝试使用WeakMemoryCache(请参阅https://github.com/nostra13/Android-Universal-Image-Loader/wiki/Useful-Info)因为理论上允许您使用所有可用内存,尽管它可能会导致大量额外的GC调用。
毕加索塔哈的方法看起来是你最好的选择!
答案 1 :(得分:1)
也许你的内存缓存大小很小,毕加索试图从光盘缓存加载图像。请检查here以确定缓存大小。您可以尝试通过以下方式增加Picasso的缓存大小:
Picasso p = new Picasso.Builder(context)
.memoryCache(new LruCache(cacheSize))
.build();
但是在我看来,你的应用看起来像是一个无尽的饲料。这意味着您的内存缓存将在某个时间充满,您将不得不使用光盘缓存。与内存缓存相比,从光盘缓存中检索数据的速度较慢。