2013-08-24 3 views
1

매우 실망한 문제가 있으며 잘못된 점을 알지 못합니다. GridView 만 포함 된 간단한 XML을 작성합니다. 이 gridview는 내 코드로 검색 한 특정 URL에서 다운로드 한 이미지 (ImageView)를 표시해야합니다.GridView에서 스크롤 할 때 ImageViews의 위치가 변경되었습니다.

그래서이 APP의 생각은 URLS에서 이미지를 다운로드하고 GridView에서 그 이미지를 보여줄뿐입니다. 먼저 Universal Image Loader 라이브러리를 사용하고 있다고 말해야합니다. 먼저 제의 getView 코드를 찾아보세요 :

@Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

     ImageView iv; 

     if(convertView == null) { 

     iv = new ImageView(MyActivity.this); 
     iv.setLayoutParams(new GridView.LayoutParams(size,size)); 
     iv.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     Log.d("APP", "convertView is NULL"); 

     } 

     else { 

     iv = (ImageView) convertView; 
     Log.d("APP", "convertView is NOT null"); 

     } 

     loader.displayImage(URLS.get(position), iv); 

     return iv; 

    } 

문제 : 위의 작품

코드, 그것은의 GridView에서 이미지를 보여줍니다.

  1. 모든 이미지를 다운로드 한 (보이지 않는 심지어 그 이미지)
  2. 내가 위로 다시 스크롤 할 때 나는, 장소 0 있다는 이미지를 볼 장소입니다 : 내가 아래로 스크롤 할 때, 나는 것을 볼 수 1 그리고 다시 다운로드되었습니다. 다시 아래로 스크롤하면 이미지의 위치가 다시 바뀝니다. 백업을 다시 스크롤하면 이미지가 다시 전환되는 것을 볼 수 있습니다 (다시 다운로드). 이것은 무한하다.

    1. 내가 convertView 변수가 null의 경우는 확인하지 않음으로써이 문제를 해결 :이 문제를 해결 방법

    . 사실 나는 if/else 절을 ​​생략했습니다.

  3. 메모리에 cache = true를 사용했습니다. 따라서 다운로드 정지 및 이미지가 영원히 존재합니다.

왜 내가 도움을 청하고 있습니까? 주로 나는 성능상의 이유로 if/else 절을 ​​생략하면 안된다는 것을 알고 있기 때문에 주로. 사용자의 기억을 망치고 싶지 않고 빠르고 안정적인 사용자 경험을 제공하고자합니다. 또한 나는 무엇이 잘못 될 수 있는지 알고 싶다.

도움 주셔서 감사합니다. 많이 appriciated.

답변

0

GridView는 성능을 위해 목록 항목을 재활용합니다. 따라서 스크롤 할 때 목록 항목이 다른 위치에서 재활용되고 코드에서 해당 항목을 다시 채 웁니다. 때때로 이것은 이미지에 대해 뒤처 질 때가 있습니다.

Picasso과 같은 종류의 라이브러리를 사용하는 것이 좋습니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 유니버설 이미지 로더는 그 목적을 위해서만 만들어 졌기 때문에 이상하지 않습니다. 하지만 너의 도서관을 볼거야. – rootpanthera

1

ImageView에 로더가 약간의 시간을 필요로합니다. 다른 이미지에 대한보기를 다시 사용하기 때문에 새 이미지가로드되는 동안보기에서 이전 이미지를 볼 수 있습니다. 이 효과를 피하기 위해 resetViewBeforeLoading(true)DisplayImageOptions에 설정할 수 있습니다.

또한 디스크 캐시를 사용하여 네트워크에서 매번 이미지를 다운로드하지 않도록 할 수 있습니다. 또한 메모리 캐시의 크기를 제한하고 다른 설정을 지정하지만 메모리 캐시가 유용하다고 생각합니다. 사용자 경험이 향상됩니다. 스크롤 할 때 지연을 피하려면 setOnScrollListener(new PauseOnScrollListener(loader, true, true))을 사용하는 것을 잊지 마십시오.

0

나는 당신과 똑같은 문제를 겪고 있었고 convertView 검사도 비활성화하지 않으려했습니다. 해결책은 ImageLoaderConfiguration에서 메모리 캐시 크기를 늘리는 것이 었습니다.내가 * 1024 * 1024 (10)가 너무 많은 경우 모르는 .memoryCache(new UsingFreqLimitedMemoryCache(10 * 1024 * 1024))

하거나가 발생합니다 .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))

그래서 나는 그것을 변경 :

전에, 나는이처럼 사용하는 데 사용 어떤 문제가 있지만, 그것은 나에게 문제를 해결 한 것으로 보이며 나는 지금까지 아무런 문제가 없었습니다.

관련 문제