Android:关闭listview的延迟加载

标签 android listview

在我的 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);

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

另一方面,如果图像倾向于改变,您可以实现一些有趣的东西:使用 SoftReferencesthis video里面有解释.如果您从文件系统加载图像,也可以使用它。

编辑

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

关于Android:关闭listview的延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4073515/

相关文章:

android - Android 上的谷歌地图空白页(白色)

java - 安卓工作室 : ListView On Touch Event

windows - 虚拟模式下的 TListView 限制为 100,000,000 个项目?

android - 如何在 ListView 的特定位置添加分隔符?

java - Android ListView 未从 SQLite 加载值

android - ListView 自动更新

java - android - 如何在 FIngerPrintHelper 类的主 Activity 中调用扩展 Asynctask 的类

javascript - 创建带有圆形滚动的水平RecyclerView

android - 在 Android 上,是否可以检测用户是否在应用免费之前购买了它?

android - 使用新版本的Firebase库时出现 “cannot access zzbfm”错误