Android中的Listview延迟加载平滑[重复]

Posted

技术标签:

【中文标题】Android中的Listview延迟加载平滑[重复]【英文标题】:Listview lazy load smoothing in Android [duplicate] 【发布时间】:2013-10-09 16:02:34 【问题描述】:

我有一个显示产品的 ListView。 每个产品都有产品详细信息 和一个ImageView,但我的问题 对图片进行延迟加载 产品。而且图像很高 解决。滚动时它变成 粘稠的(不光滑)。因为下载 图像需要时间。 facebook有同样的方式 他们的图像,但滚动很多 更流畅的任何解决方案请帮助。

【问题讨论】:

使用 LruCache 并以首选大小解码位图 【参考方案1】:
public class BitmapCacheManager 
    private static LruCache<Object, Bitmap> cache = null;
    private final Context context;
    private static final int KB = 1024;
    private final Drawable placeHolder;


    public BitmapCacheManager(Context context) 
        this.context = context;
        placeHolder = context.getResources().getDrawable(R.drawable.unknown);
        int maxMemory = (int) (Runtime.getRuntime().maxMemory() / KB);
        int cacheSize = maxMemory / 7;
        cache = new LruCache<Object, Bitmap>(cacheSize) 
            @Override
            protected int sizeOf(Object albumId, Bitmap bitmap) 
                return (bitmap.getRowBytes() * bitmap.getHeight() / KB);
            

            protected void entryRemoved(boolean evicted, Object key, Bitmap oldValue, Bitmap newValue) 
                oldValue.recycle();
            
        ;
    

    public void addBitmapToMemoryCache(Object key, Bitmap bitmap) 
        if (bitmap != null && key != null && cache.get(key) == null)
            cache.put(key, bitmap);
    

    public Bitmap getBitmapFromMemCache(Object key) 
        return cache.get(key);
    

    public void loadBitmap(final Object key, final ImageView imageView) 
        final Bitmap bitmap = getBitmapFromMemCache(key);
        if (bitmap != null) 
            imageView.setImageBitmap(bitmap);
         else 
            imageView.setImageDrawable(placeHolder);
            BitmapWorker task = new BitmapWorker(imageView);
            task.execute(key);
        
    

    private class BitmapWorker extends AsyncTask<Object, Void, Bitmap> 
        private final ImageView imageView;
        private Object key;

        public BitmapWorker(final ImageView imageView) 
            this.imageView = imageView;
        

        @Implement
        protected Bitmap doInBackground(Object... params) 
            key = params[0];
            final Bitmap b = SomeClass.GetSomeBitmap(context, key);
            addBitmapToMemoryCache(key, b);
            return b;
        

        @Override
        protected void onPostExecute(final Bitmap bitmap) 
            if (bitmap == null) 
                imageView.setImageBitmap(SomeClass.DefaultBitmap);
                return;
            
            if (imageView.getTag().toString().equalsIgnoreCase(key.toString()) && !bitmap.isRecycled())
                imageView.setImageBitmap(bitmap);
        
    


然后调用:

bitmapCacheManager.loadBitmap(somekey, someImageView);

【讨论】:

【参考方案2】:
    将虚拟图像添加到所有占位符,以便滚动顺畅。 使用异步任务根据需要获取图像,并在图像准备好后将虚拟图像替换为正确的图像。 使用正确的命名约定缓存图像,并根据您的图像大小正确选择缓存大小。

【讨论】:

以上是关于Android中的Listview延迟加载平滑[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 的 ListView 中延迟加载图像

在android(初级)的Listview上延迟加载图像? [复制]

从服务器 json 响应延迟加载 listview 项

提高 Android ListView 中的滚动平滑度

Android - ListView 中的延迟点击

Android:将数据添加到 ArrayAdapter 时可见的 ListView 图像闪烁