在我的 Android 应用程序中,我有一个包含 30 行的 ListView ,每一行都包含几个 TextView ,其中一个是可跨越的,有时包含大量格式化文本和图像。
这些图像是从网络异步加载的:显示一个占位符,直到图像被下载然后被图像替换。
不幸的是,当我滚动它们时, ListView 的行被加载了。这使得整个事情变得非常缓慢。此外,每当我在该行上滚动时,这些图像都会一次又一次地从网络上加载。
我怎样才能关闭它,当我滚动它们时加载 ListView 行?它们应该在我开始 Activity 时加载一次,而不会再加载一次。
提前致以最诚挚的问候和感谢, 简·奥利弗
最佳答案
当你执行延迟加载 ListView 时,是因为你想加速你的应用程序。关闭它不是最好的解决方案。因此,您可以做的是实现一个基本的缓存系统,以避免一次又一次地下载和设置 ImageView。
最简单的方法是实现一个以 URL 为键、以位图为值的 HashMap。像这样:
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);
如果这些图像总是相同的,这意味着每次打开应用程序时都会下载相同的图像,那么您最好将这些图像保存在文件系统中并从那里使用它们。
另一方面,如果图像倾向于改变,您可以实现一些有趣的东西:使用 SoftReferences
。 this video里面有解释.如果您从文件系统加载图像,也可以使用它。
编辑
关于您的评论,我强烈建议您观看我发布的视频。虽然只有一个小时,但真的很值得。使用适配器时,检查 convertView 是否为 null 只是提高性能的一种简单方法,尽管还有一些其他技术可以进一步改善您的应用程序。此外,如果您在使用该技巧时遇到问题,那是因为您可能以错误的方式实现它。请记住:即使您不重新膨胀 View ,您也必须设置每个 subview 的值,否则您会遇到一些问题。
关于Android:关闭listview的延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4073515/