如何刷新ImageView的内容

3

我有一个屏幕,其中包含实际个人资料图片的ImageView。我可以通过使用相机拍照或从SD卡中选择照片来编辑该个人资料图片。我将新选择的个人资料图片存储在与旧图片相同的路径下(覆盖它),这很合理。

但是,当我将新的个人资料图片设置为我的ImageView时,它没有得到刷新。我必须重新启动应用程序才能看到更改。

this.imageView.invalidate();

当我浏览谷歌时,所有人都告诉我要这样做,但是不行!那么我该如何强制我的ImageView加载新的个人资料图片呢?

我借助Picasso将图像加载到ImageView中:

Picasso picasso = Picasso.with(context);

if(reload) {
    picasso.invalidate(new File(fileName));
}

RequestCreator requestCreator = picasso.load(new File(fileName));
requestCreator.into(imageView);

只需重新加载位图并将其设置为“ImageView”。没有其他方法可以刷新“ImageView”。 - Xaver Kapeller
这是我正在使用Picasso帮助完成的工作。 - Mulgard
你应该从一开始就提到你正在使用 Picasso。Picasso 会缓存图片。因此最有可能的情况是,Picasso 从缓存中加载旧图片而不是从磁盘加载新图片。你需要这样使缓存失效:Picasso.with(getActivity()).invalidate(file); - Xaver Kapeller
1
这也没有重新加载imageview的新内容。 - Mulgard
这对我有效,看我的回答。并且放弃那个 if(reload) { ... },你不需要那个。 - Xaver Kapeller
可能是在Picasso中使缓存失效的重复问题 - Xaver Kapeller
2个回答

7

Picasso会缓存已加载的图片以加快加载速度。这意味着,如果您尝试重新加载完全相同的图片,它将加载缓存版本,而不是从磁盘读取已更改的File

您需要告诉Picasso图片已更改,并且需要通过使缓存无效来从磁盘重新加载图片。您可以通过以下方式实现:

File file = new File(fileName);
Picasso picasso = Picasso.with(context);
picasso.invalidate(file);
picasso.load(file).into(imageView);

4
为了跳过Picasso的缓存,您可以使用.memoryPolicy(MemoryPolicy.NO_CACHE)静态方法:
Picasso
    .with(context)
    .load(file)
    .memoryPolicy(MemoryPolicy.NO_CACHE)
    .into(imageView);

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