在LIstView中缓慢加载图像



我已经在我的应用程序(twitter类型的应用程序)中实现了图像的延迟加载(从远程服务器),提取部分和将图像加载到确切的imageView中工作得非常好。但是,只有在我向下滚动ListView之后,适配器的"getView"部分才会被调用,因此只有在我往下滚动之后,才会从远程服务器获取图像(我通过在适配器的"getView"代码中执行asyntack来获取图像),并且我可以看到加载的图像有相当大的延迟。一旦图像被加载并存储在内存缓存中,在向上或向下滚动时就没有问题。唯一的问题是第一次加载图像加载缓慢的

那么,有没有一种方法可以纠正它,当我向下滚动时,我应该能够获得图像位图,并在向下滚动时设置位图。我希望它能像推特应用程序一样,在那里我看不到加载个人资料图片的滞后。

TIA

好吧,你的方法是不正确的,你必须在每次滚动列表时将所有图像显示为get-view之前获取它们,所以每次调用你的服务并获取列表可以在屏幕上显示的图像数量(比如一次4-5个)。

您要做的是:-1) 获取所有图像。2) 当您获取所有图像时,将适配器设置为listview,您将在列表中获得所有图像,而不会有任何延迟,因为您已经下载了图像,

但这不是懒惰加载--懒惰加载意味着用户一次只能看到图像的一部分,如果他不滚动,从服务下载图像就没有意义。

希望这对有帮助

如果在getView()方法中调用Web服务,则每次上下滚动时都会调用它。因为getView方法是为屏幕上可见的行调用的。

您可以做的是将图像加载到HashMap<int, Object>,其中int==listview中的位置,object就是图像。然后,在getview中,您可以检查位置+(1->10)是否已加载,如果没有,则在某种后台任务中从Web服务中检索它们。在hashmap中加载图像,并使getView()方法使用这些图像。不是直接从Web服务中检索到的图像。否则,您将不得不等待它们被检索到。同样,通过这种方式,您可以在hashmap中缓存图像,而不是在上下滚动时重复检索相同的图像。

当然,已经有人制作了这样的适配器,通过在这里搜索,我发现了这个SO问题,它的答案指向CommonsWare无尽的适配器。

有一个名为AALP的库,可以用来帮助您懒惰地加载列表视图。https://bitbucket.org/zedvoid/aalp/src希望这能为你节省一些时间和精力。

最新更新