1

我有点困惑:通常,当将图像异步加载到某种列表视图(无论是在 Android 或 iOS 上还是在另一个平台上抽象地)时,你基本上必须这样做..

-- make a note of "which" cell this is (say, #213)
-- start getting the image from the net.
-- it has loaded from the net. What cell are we now?
-- if we are "still" 213, load the image to the image view!
-- if we are "no longer" 213, just forget about it.

这是延迟加载异步图像的基础。例如,Lucas Rocha 在这里的一篇著名文章中完美地解释了它:

http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/

(向下滚动到“这只是您可以做到的一种方法的简单草图:” ...)

好吧,据我所知,毕加索实际上是完全自动为您做到的。

就其本身而言,毕加索“知道”观点是否发生了变化。如果视图发生了变化,毕加索知道不必费心加载它

我完全正确吗?这是毕加索的内置功能,我不需要做其他事情吗?

(除此之外 - 我有点困惑“毕加索是如何做到这一点的;瞥了一眼它,我看不到毕加索的任何魔术代码,它记录了 id 或持有者的某些东西?视图?有问题。)


为了清楚起见,我以通常的方式使用 Picasso,基本上是在 getView 的末尾......

Picasso.
  with(State.mainContext).
  load(imageFile.getUrl()).
  placeholder(R.drawable.default).
  noFade().
  into(v.hexaIV);
4

1 回答 1

4

是的,Picasso有那么漂亮吗?您只需要 getView() 方法中的那一行Picasso.with(c).load(url).into(img);

他们到底是怎么做的,我不确定,但在Picasso存在之前我做了我自己的图像加载器,这并不难。

假设您在图像加载器代码的某处有一个 Url 和 ImageView 的地图。

因此,每当代码传递img给它时,它都会检查这个映射,如果它已经img使用基本 Java加载了相同的其他 URL mImg.equals(img),如果它匹配,它知道,即使你仍然会缓存那个 URL,它也不应该传递 Drawable到 ImageView。

在极少数情况下,您可能希望直接取消加载,在这些情况下您可以调用Picasso.with(c).cancel(img);,但这很少是必要的。

于 2014-09-09T13:59:43.090 回答