2

我有一个显示位图图片的 ListView。这些位图变得非常大。当我在 ListView 上滚动时,它似乎很重。我可以使用哪些技术来优化 ListView ?这可能包括在内存中压缩位图,或增强列表视图内存管理的方法?

4

2 回答 2

4

首先,阅读本文,

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

它讨论了视图持有者模式,以及在线程中加载图像。也,读这个,

http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

这将讨论如何为位图构建有效的内存缓存。

如果这还不够,您可以采用的另一种技术是避免在滚动停止之前加载图像。如果用户说扔到列表底部,这可以防止列表视图加载所有图像。基本上,像这样的东西,

    pagerList.setOnScrollListener(new OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            if (scrollState != OnScrollListener.SCROLL_STATE_IDLE) {
                return;
            }
            // load images for adapter views between first and first+count.
            // depending on your memory requirements, you can pre-load additional
            // images before first and after first+count to give a better
            // user exp
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            first = firstVisibleItem;
            count = visibleItemCount;
        }
    });

这要求您ImageView为适配器中的每个项目保留一个句柄,以便稍后找到它并将适当的位图设置到其中。这可以像在适配器中保留一组图像视图一样简单,其中索引 == 列表视图中的位置。

于 2012-09-06T18:53:29.387 回答
0

我主要使用 LruCache 来优化列表并从缓存LruCache加载图像

在 BaseAdapter 类的 getView 中添加它

@Override
    public View getView(.....
   ..... . .  
     Bitmap image = getBitmapFromMemCache(name);
        if (image == null)
        {
         image = decodeSampledBitmapFromUri(image_path.get(position), 64,64);
        }
        else
        {
            Log.i("loding. ", "from cache "+name);
        }
        // Bitmap ThumbImage = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(details), 64, 64);
         holder.img.setImageBitmap(image);
         addBitmapToMemoryCache(name, image);
于 2014-10-02T06:56:17.747 回答