Android:关闭listview的延迟加载

jan*_*ver 6 android listview

在我的Android应用程序中,我有一个包含30行的列表视图,每行包含几个文本视图,其中一个是可跨越的,有时包含大量格式化的文本和图像.

这些图像是从网络上异步加载的:显示占位符直到图像被下载后由图像替换.

不幸的是,当我滚动它们时会加载listview的行.这使整个事情变得非常缓慢.此外,每当我滚动行时,这些图像会一次又一次地从Web加载.

如何关闭它,当我滚动它们时加载ListView行?当我开始活动时,它们应该被加载一次,而不再被加载.

最诚挚的问候和感谢,Jan Oliver

Cri*_*ian 5

当您执行延迟加载ListView时,是因为您想加快应用程序的速度.关闭它不是最好的解决方案.因此,您可以做的是实现一个基本的缓存系统,以避免一次又一次地下载和设置ImageView.

最简单的方法是实现一个HashMap,其中URL作为键,位图作为值.像这样的东西:

Map cache = new HashMap();
// then, on your lazy loader
Bitmap image = cache.get(urlOfTheImage);
if( image == null ){
    // download and decode the image as normal,
    // then assign the decoded bitmap to
    // the 'image' variable
    cache.put(image);
}
imageView.setImageBitmap(image);
Run Code Online (Sandbox Code Playgroud)

如果这些图像总是相同的,这意味着每次打开应用程序时都会下载相同的图像,然后您最好将这些图像保存在文件系统中并从那里使用它们.

另一方面,如果图像倾向于改变,你可以实现一些有趣的东西:使用SoftReferences.这个视频有一个解释.如果要从文件系统加载图像,也可以使用此方法.

编辑

关于您的评论,我强烈建议您观看我发布的视频.这是一个小时,但它确实值得努力.使用适配器时,检查convertView是否为null只是提高性能的一种简单方法,尽管还有一些其他技术可以进一步改善您的应用程序.此外,如果您在使用该技巧时遇到问题,那是因为您可能以错误的方式实现它.请记住:即使您不重新夸大视图,也必须设置每个子视图的值,否则您将遇到一些问题.