2012-09-06 3 views
2

나는 비트 맵 그림을 표시하는 ListView를 가지고 있습니다. 이러한 비트 맵은 상당히 커집니다. ListView에서 스크롤하면 매우 무거워 보입니다. ListView를 최적화하기 위해 어떤 기법을 사용할 수 있습니까? 비트 맵을 메모리에 압축하거나 목록보기 메모리 관리를 향상시키는 방법을 다룰 수 있습니까?Android ListView 비트 맵 최적화

답변

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에 대한 핸들을 유지하는 것이 필요하므로 나중에 그것을 발견하고 그것으로 적절한 비트 맵을 설정할 수 있습니다. 이는 어댑터에 이미지 뷰 배열을 유지하는 것처럼 간단 할 수 있습니다. 여기서 인덱스 == 목록보기의 위치입니다.

+0

감사이 추가 캐시에서 목록 및로드 이미지를 최적화 할 수 LruCache를 사용! 나는 잠시 동안이 문제를 해결하는 방법에 대해 궁금해왔다. :) – nhaarman

0

나는 대부분 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);