21

我无法在任何真正可靠的来源中找到解释 LazyList 是什么。任何人?

4

4 回答 4

39

延迟列表是从 sd 卡或使用 url 的服务器延迟加载图像。这就像按需加载图像。

图像可以缓存到本地 sd 卡或手机内存中。URL 被认为是关键。如果密钥存在于 sd 卡中,则从 sd 卡中显示图像,否则它会从服务器下载图像并将其缓存到您选择的位置。您可以设置缓存限制。您还可以选择自己的位置来缓存图像。缓存也可以清除。

与用户等待下载大图像然后显示它们不同,惰性列表按需加载图像。由于图像被缓存,您可以离线显示图像。

https://github.com/thest1/LazyList。懒惰列表

在你的 getview

imageLoader.DisplayImage(imageurl, imageview);

ImageLoader 显示方法

    public void DisplayImage(String url, ImageView imageView) //url and imageview as parameters
    {
    imageViews.put(imageView, url);
    Bitmap bitmap=memoryCache.get(url);   //get image from cache using url as key
    if(bitmap!=null)         //if image exists
        imageView.setImageBitmap(bitmap);  //display iamge
     else   //downlaod image and dispaly. add to cache.
     {
        queuePhoto(url, imageView);
        imageView.setImageResource(stub_id);
     }
   }

惰性列表的替代方法是通用图像加载器

https://github.com/nostra13/Android-Universal-Image-Loader。它基于惰性列表(它的工作原理相同),但它有很多其他配置。我更喜欢使用Universal Image Loader,因为它为您提供了更多配置选项。如果下载失败,它会显示错误图像。它可以显示带有圆角的图像。它可以缓存在磁盘或内存上。它可以压缩图像。

在您的自定义适配器构造函数中

  File cacheDir = StorageUtils.getOwnCacheDirectory(a, "your folder");

 // Get singletone instance of ImageLoader
 imageLoader = ImageLoader.getInstance();
 // Create configuration for ImageLoader (all options are optional)
 ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a)
          // You can pass your own memory cache implementation
         .discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation
         .discCacheFileNameGenerator(new HashCodeFileNameGenerator())
         .enableLogging()
         .build();
 // Initialize ImageLoader with created configuration. Do it once.
 imageLoader.init(config);
 options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.stub_id)//display stub image
.cacheInMemory()
.cacheOnDisc()
.displayer(new RoundedBitmapDisplayer(20))
.build();

在你的 getView()

  ImageView image=(ImageView)vi.findViewById(R.id.imageview); 
  imageLoader.displayImage(imageurl, image,options);//provide imageurl, imageview and options

您可以使用其他选项配置 Universal Image Loader 以满足您的需求。

与 LazyList/Universal Image Loader 一起,您可以查看此网站以获得平滑滚动和性能。 http://developer.android.com/training/improving-layouts/smooth-scrolling.html

于 2013-03-25T18:44:30.487 回答
9

AFAIK,我将通过示例向您解释如果您的列表包含大量带有文本的图像,则加载列表需要一些时间,因为您需要下载图像并且需要将它们填充到列表中。假设您的列表包含 100 张图片,下载每张图片并显示列表项将花费大量时间。让用户等到图像加载对用户不友好。所以我们需要做什么。此时,惰性列表出现了。这是让图像在后台加载并显示文本的想法。

每个人都知道 listview 为每个视图回收它的视图。即,如果您的列表视图包含 40 个元素,那么列表视图不会为 40 个项目分配内存,而是为可见项目分配内存,也就是说,您一次只能看到 10 个项目。所以 listview 将分配 10 个项目的内存。

因此,当您滚动视图时,视图将刷新。因为您将失去对图像的引用,您需要重新下载它们。为了避免这种情况,缓存出现了。

这个例子是基于我在 listview 中的知识,我并不是说这只是正确的。答案可能有误,如果有人发现请随时通知我。

于 2013-03-25T18:28:09.937 回答
5

我认为这是相反的。AFAIK,延迟加载是定义,只有在需要时才实际加载数据,这是一个很好的设计实践。

所以我相信这同样适用,只是这次它指的是列表视图。

如果我错了,请纠正我。

于 2013-03-25T18:21:52.873 回答
2

惰性列表的最佳示例是 facebook 通知、消息、请求。当您滚动时,将加载数据。

于 2013-03-25T18:27:54.270 回答