【问题标题】:Show ListView item only after download the image using Picasso仅在使用 Picasso 下载图像后显示 ListView 项目
【发布时间】:2015-04-10 17:42:21
【问题描述】:

我正在使用Picasso 在我的 ListView 中加载图像。这个ListView的item没有占位图片,加载的图片大小不一。此列表在我的应用程序中用作时间线。我的问题是当我快速滚动时,项目会出现,并在一段时间后显示图像。这会导致在我滚动列表时项目被展开的不良效果。

我想知道是否有什么方法可以在毕加索下载图片后显示此项目。

这就是我在我的 adpater 的 getView 中设置图像的方式:

View v = convertView;

ViewHolder viewHolder;

if (v == null) {
    v = inflater.inflate(R.layout.timeline_item, parent, false);
    viewHolder = new ViewHolder();
    viewHolder.photo = (ImageView) v.findViewById(R.id.image_view);
    v.setTag(viewHolder);
} else {
    ViewHolder = (ViewHolder) v.getTag();
}

Picasso.with(context).load(timeline.getImage()).into(ViewHolder.photo);
return v;

【问题讨论】:

  • 你能显示加载图像的代码吗?
  • 我不确定您是否可以跳过没有图像的项目并稍后回来添加它。为什么不放一些默认图像或进度条,直到图像加载完毕,然后在准备好后将其更改为图像
  • 我更新了问题

标签: android listview picasso


【解决方案1】:

我之前处理过一个相对类似的问题。您正在寻找的是一个回调方法。当您创建请求时,毕加索就有这样的东西。

public void into(android.widget.ImageView target, Callback callback)

因此,您需要在当前代码中添加 com.squareup.picasso.Callback 的实现并在此处提供:

Picasso.with(context).load(timeline.getImage()).into(ViewHolder.photo, <Callback here>);

在该回调中,您将图像添加到列表视图。

这当然有问题。代码 sn-p 似乎来自适配器的 getView()。这意味着您尝试仅在滚动到 ListView 中的该视图之后将视图添加到 ListView。

我确实对如何实现这一目标提出了建议,但我不能 100% 确定它的效果如何。您可以尝试将布局 (R.layout.timeline_item) 设置为可见性 View.GONE。这可能会导致所有图像在加载 ListView 后同时开始加载,我假设您希望它们仅在到达列表后才开始加载。

【讨论】:

  • 我看到了这个回调,但我不知道如何使用它来解决我的问题。因为我会知道图片下载成功的时候,但是列表已经滚动了,没有图片的列表项会出现在列表中,最后毕加索下载图片后,这个项目被展开,导致我有副作用现在。
  • 我不确定您是否完全明白我所说的将布局设置为可见性 View.GONE 的意思。这是整个项目,而不仅仅是视图。正如我之前所说,我不确定该解决方案将如何实现您的目标,但您的评论似乎表明您并没有完全理解我的意思。但是,如果您不想看到任何加载,您唯一的选择是预加载您将使用的图像。您可以为此目的使用 fetch 方法。这样当你稍后使用 into 方法时,你的图像已经被缓存了。
【解决方案2】:

我认为毕加索一切皆有可能:)

我真的不知道你想做什么,但我想解决方案是在加载图像时放置一些东西,不是吗?

你可以使用它

Picasso.with(context)
.load(url)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);

您可以在加载时设置图像,如果出现错误,显示错误图标,只是说。

如果这对您无效,请告诉我,我们可以尝试寻找其他解决方案。

【讨论】:

  • 问题是:我加载的图像尺寸不同(宽度相同,但高度不同)。所以,如果我在下载时显示一个占位符会发生相同的效果,那就是在我滚动时显示在我的 ListView 中的图像的扩大或缩小。
  • aham,好的,我知道,在这种情况下,您可以对每个 img 使用其他参数,例如宽度和高度。因此,通过这种方式,您的所有照片都将具有相同的大小,然后,您可以通过 centercrop 将 img 居中...举个例子更好:Picasso.with(context) .load(url) .resize(50, 50) .centerCrop() .into(imageView)
  • 是的,这是一个可能的解决方案,但我必须按原样显示图像,也就是说,具有不同的高度。
  • 好的,所以我不明白你想要做什么,因为你不想改变大小并且你不想在加载时放置一个占位符......你做什么?你想在滚动的时候没有延迟吗??
  • 问题不是我“想要”做的。问题是我“必须”做的事情。同样,我无法为图像添加固定高度,因此放置占位符不会解决问题。是的,有一个标签。我将它设置为我的 ViewHolder。
猜你喜欢
  • 1970-01-01
  • 2018-04-23
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 2017-01-14
相关资源
最近更新 更多