首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是LazyList?

什么是LazyList?
EN

Stack Overflow用户
提问于 2013-03-26 02:19:02
回答 4查看 77K关注 0票数 21

我找不到任何真正可信的来源来解释什么是LazyList。有没有人?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-26 02:44:30

延迟列表是使用urls从SD卡或服务器延迟加载图像。这就像按需加载图像一样。

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

而不是用户等待下载大图像,然后显示它们,惰性列表按需加载图像。由于图像已缓存,因此您可以脱机显示图像。

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

在你的getview中

代码语言:javascript
复制
imageLoader.DisplayImage(imageurl, imageview);

ImageLoader显示方法

代码语言:javascript
复制
    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);
     }
   }

Lazy List的替代方案是通用图像加载器

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

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

代码语言:javascript
复制
  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()中

代码语言:javascript
复制
  ImageView image=(ImageView)vi.findViewById(R.id.imageview); 
  imageLoader.displayImage(imageurl, image,options);//provide imageurl, imageview and options

您可以使用其他选项来配置通用图像加载器,以满足您的需要。

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

票数 39
EN

Stack Overflow用户

发布于 2013-03-26 02:28:10

AFAIK,我会用这个例子向你解释,如果你的列表包含很多带文本的图片,加载你的列表将需要一些时间,因为你需要下载图像,并且你需要在列表中填充它们。假设您的列表包含100个图像,则下载每个图像并向其显示列表项目将花费大量时间。让用户等待直到图像加载是不友好的。所以我们需要做的是。在这一点上,懒惰列表出现了。它的想法是让图像在背景中加载,同时显示文本。

每个人都知道listview在每个视图中循环使用它的视图。也就是说,如果你的listview包含40个元素,那么listview不会为40个项目分配内存,而是为可见的项目分配内存,也就是说,你一次只能看到10个项目。所以listview将分配10项内存。

所以当你滚动视图的时候,视图就会刷新。因此,您将丢失对图像的引用,并且需要重新下载它们。为了避免这种情况,缓存应运而生。

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

票数 9
EN

Stack Overflow用户

发布于 2013-03-26 02:21:53

我认为这是另一种方式。AFAIK,Lazy Loading是一个定义,你实际只在需要的时候加载数据,这是一个很好的设计实践。

所以我相信这同样适用于此,只是这一次它引用的是List View。

如果我错了,请纠正我。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15621936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档