문제

이것은 매우 일반적인 시나리오입니다. 인터넷에서 다운로드 해야하는 ListView에 이미지 표시.

지금은 ListView에 사용하는 ArrayAdapter의 사용자 정의 서브 클래스가 있습니다. arrayadapter의 getView () 구현에서 이미지를로드하기 위해 별도의 스레드를 생성합니다. 로드가 완료되면 적절한 ImageView를 찾아 이미지를 imageView.SetImagedRawable ()로 설정합니다. 그래서 내가 사용한 솔루션은 이것과 비슷합니다. ListView의 게으른 이미지로드

내가 가진 문제는 ImageView에서 setImagedRawable ()를 호출하자마자 ListView는 어떻게 든 목록에서 현재 보이는 모든 행을 새로 고침한다는 것입니다! 이것은 일종의 무한 루프를 초래합니다 :

  1. getView ()가 호출됩니다
  2. 스레드가 이미지를로드하도록 스폰됩니다
  3. 이미지가로드되었습니다. setImagedRawable ()는 ImageView에서 호출됩니다
  4. ListView는 어떤 이유로 든 픽업하고 스스로 새로 고침됩니다.
  5. ListView가 새로 고침하려면 가시적 인 행에 GetView ()가 호출되므로 1 단계로 돌아가서 모든 것이 반복됩니다.

내가 볼 수있는 한, "Android-"ListView에서 게으른 이미지를 어떻게 수행합니까? "(위의 링크 참조)에서 제안 된 솔루션은 단순히 작동하지 않습니다. 배경에서는 현재 보이는 행을 계속 재 장전하기 때문에 매우 느리게 작동합니다.

전에 이것에 대한 해결책이 있거나 이것에 대한 해결책이 있습니까?

도움이 되었습니까?

해결책

연결된 솔루션에서 fetchDrawableOnThread() 보기에 이미 올바른 드로잉이없는 경우에만 호출해야합니다.

보기에는 그 그림이 없습니다 getDrawable() NULL을 반환합니다.

슬롯을 재사용하는 경우 더 나아가 상태를 관리해야합니다. 조회수에 URL을 저장하는 회원 변수가 있고 부전이로드되었는지 여부를 말하는 부울이있는 경우 전화할지 여부를 알기가 쉽습니다. fetchDrawableOnThread() 예를 들어.

나는 그 그림이 있다고 추측 할 것이다 toString() 이미지가로드 된 경로를 자세히 설명했습니다. (그렇지 않으면, 당신은 그것을 만들기 위해 소개 할 수있는 소위를 서브 클래스 할 수 있습니다). 이 경우 위에서 설명한 부울을 피하고 올바른 뽑을 수 있는지 또는 교체를 가져올 지 여부를 결정하기 위해 비교할 수 있습니다.

또한, 가시적 인 행의 getView ()는 더 이상 보이지 않는 사람들이 언로드되어 메모리 소진을 방지해야합니다. 원래 스레드의 다른 포스터와 같이 더 이상 보이지 않는 이미지를 더 이상 보이지 않는 이미지를 더 이상 보이지 않는 이미지를 소프트 레퍼런스로 옮기는 것입니다 (메모리가 필요할 때 언로드됩니다).

다른 팁

다음 링크에서 코드를 사용했습니다. 또 다른 stackoverflow 질문

재활용 뷰 문제를 해결하기 위해 작은 변경을했습니다. Image의 URL을 어댑터의 ImageView 태그로 설정했습니다. 다음 코드에는 재활용 문제를 해결하는 솔루션이 포함되어 있습니다.

public void fetchDrawableOnThread(final String urlString, final ImageView imageView,Drawable drw) {

    imageView.setImageDrawable(drw);//drw is default image
    if (drawableMap.containsKey(urlString)) {
        if(imageView.getTag().toString().equals(urlString))
        {
            imageView.setImageBitmap(drawableMap.get(urlString));
            imageView.invalidate();
            return;
        }

    }

    final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message message) {
            BitmapWrapper wrapper = (BitmapWrapper)message.obj;
            if(wrapper.imageurl.equals(imageView.getTag().toString()))
            {
                imageView.setImageBitmap((Bitmap)wrapper.bitmap);
                imageView.invalidate();
            }

        }
    };

    Thread thread = new Thread() {
        @Override
        public void run() {
            //TODO : set imageView to a "pending" image

            Bitmap drawable = fetchDrawable(urlString);
            BitmapWrapper wrapper = new BitmapWrapper();
            wrapper.bitmap = drawable;
            wrapper.imageurl = urlString;
            Message message = handler.obtainMessage(1, wrapper);
            handler.sendMessage(message);
        }
    };
    thread.start();
}


    public class BitmapWrapper
{
    public Bitmap bitmap;
    public String imageurl;
}

나는 같은 문제가 있었다.

거의 2 일간의 무거운 디버깅/최적화 및 알아 내려고 한 후 getView() 사용할 때 모든 견해를 반복해서 반복합니다. setImageBitmap() 연속으로, 나는 더러운 해결책을 생각해 냈습니다.

1) 관습을 확장하십시오 ImageView 목록의 모든 이미지에 사용하는

2) 이것에서 ImageView 메소드를 덮어 씁니다

@Override
public void requestLayout()
{ 
  return; 
}

3) 더럽지 만 저에게는 작동합니다

4) 이익;)

나는있다 Thumbnailadapter 그것은 도움이 될 수있는이 전체 패턴을 마무리합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top