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 に答える