滑动ListView时如何使Glide重新加载内容

4
我正在使用Glide加载内容,用它来加载页面中的1张图片,如果我关闭并重新打开应用程序,则它可以正常工作。问题是当我在ListView上使用它时,Glide总是重新下载它。
详细错误步骤:
  1. 从服务器加载内容后,所有图像都正常显示
  2. 然后我向下滚动,新内容也正常显示
  3. 当我向上滚动时,所有图像都消失了,但是在1秒钟后我的图像再次出现,因为Glide重新加载了它,就像之前没有加载过一样。
  4. 如果我有纵向方向,第一次加载时,它将填充布局宽度,但第二次(滚动回ListView)图像会变小而不是全宽度。
这是我的代码片段:
View view = convertView;
if (null == view) {
    view = View.inflate(parent.getContext(), R.layout.item, null);
}

ImageView ivAvatar = (ImageView) view.findViewById(R.id.iv_avatar);
ImageView ivPicture = (ImageView) view.findViewById(R.id.iv_picture);
TextView tvName = ....
...
tvName.setText(.....);  

Glide.with(parent.getContext()).load(Api.getUrlImage(contents.get(position).avatar, 50, 0)).into(ivAvatar);
Glide.with(parent.getContext()).load(Api.getUrlImage(contents.get(position).picture, 400, 0)).into(ivPicture);

在第3点上,就像是一个闪烁,但图像视图丢失了它的高度。图像下方的文本向上移动(就像没有图像视图),然后在滑动完成加载图像后返回到原位。
在第4点上,我的屏幕分辨率为480px,并且我加载了400px的图像(由服务器调整大小),如第二个滑动代码所示。
我的问题是,如何消除这个闪烁的图像?
*我在低端设备和高端设备(三星Tab S)上运行此操作,两者都出现了闪烁。
2个回答

2

在您的适配器中,在onCreateView方法中使用glide之前,请尝试使用if语句,就像这样:

示例代码:

if (yourImageView.getDrawable() == null)
// load your image 

因此,如果图片已经加载完成,该方法不会返回 null。


@NameSurname 欢迎兄弟 - Mahmoud Abu Alheja
这将保留先前加载的图像,但是它会是错误的。ViewHolders 被重复使用,无论视图持有者在哪里以及用于哪些数据,您只会看到第一个加载的图像。 - Sermilion
1
@Sermilion,当视图被回收时,您可以从视图中删除一张图片,使用onViewRecycled方法。 - Mahmoud Abu Alheja

0

尝试使用dontAnimate(),看看是否能解决问题?

如果问题仍然存在,那么这是因为Glide释放了先前图像的资源,以加载后续图像。

如果您有很多图片要在滚动列表中加载,并且需要支持低规格设备,则Fresco是更好的选择。http://frescolib.org/index.html它使用本地内存,并且对于5.0以下的Android设备,具有更好的位图资源管理功能。


我刚刚尝试实现Frescolib,目前正常工作。顺便提一下,我曾以为是我代码中图片高度的错误,直到读到这个链接:http://frescolib.org/docs/wrap-content.html - gondai yosuke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接