2012-08-16 4 views
3

TextViewImageView으로 표시되는 ListView을 목록 항목 행으로 만듭니다. 사용자을 눌러 update button 내가 당기는 AsyncTask을 발사하고 때기존 ListVIew에 더 많은 항목을 추가 할 때 ImageView가 겹칩니다.

처음에 나는리스트 뷰보기에서 로컬 데이터베이스에서 기본 항목을로드하고 난

서버

에서 더 많은 항목을로드하기 목록보기의 상단에 update button아이콘 URL과 텍스트 서버에서.

ImageView에서 아이콘을로드하려면 ImageDownloader이라는 샘플을 사용하고 있는데 문제는 ImageView가 ViewHolder 패턴의 이전 ImageViews bcoz와 겹쳐져 있다는 것입니다. 그래서 누군가 내가 뭘 잘못 생각하고 있니?

여기가

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

       ViewHolder holder; 
       TemplateData data = (TemplateData) this.getItem(position); 

       if(convertView == null){ 
        LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        convertView=inflater.inflate(R.layout.text_template_default_row, parent, false); 

        holder = new ViewHolder(); 
        holder.templateText = (TextView) convertView.findViewById(R.id.defText); 
        holder.templateIcon = (ImageView)convertView.findViewById(R.id.defIcon); 
        holder.templateTitle = (TextView) convertView.findViewById(R.id.defTitle); 

        convertView.setTag(holder); 

       }else{ 

        holder = (ViewHolder)convertView.getTag(); 

       } 


       holder.templateText.setText(data.getText()); 
       holder.templateTitle.setText(data.getTemplateTitle()); 

       //isImageLoading initially sets to false so that default items will use the 
       // resource ids , it gets falsed when AsyncTask finished load Images and update the 
       //adapter and at that time this adapter has to pic the image from ImageDowloader 
       if(!isImageLoading) 
        data.setTemplateIconId(iconList[position]); 


       //Has resource id but not icon url 
       if(data.getTemplateIconId()!=0 && data.getTemplateIconUrl()==null){ 

        Log.d("Load icon ","Default Load"); 

        holder.templateIcon.setBackgroundResource(data.getTemplateIconId()); 



       // does not has recource id so load url from server 
       }else if(data.getTemplateIconUrl()!=null && data.getTemplateIconId()==0){ 


        Log.d("Load icon ","From Server Load"); 

        imageDownloader.download(data.getTemplateIconUrl(), (ImageView) holder.templateIcon); 



       } 




        return convertView; 

     } 

iconList 응용 프로그램에서 기존 아이콘의 리소스 ID를 포함 내 ListView에 어댑터 코드입니다. 누군가 더 자세한 정보를 원하면 언제든지 문의하십시오. 여기

편집

는 처음 8 개 템플릿 만 안드로이드 휴대폰에 저장된 데이터베이스에서로드 & 아이콘이있을 것 스크린 샷입니다. 그 이름은 템플릿 1에서 사용자가 버튼 새로운 템플릿을 여기에로드됩니다 업데이 트를 누르면 지금

default view

템플릿 6

에 시작합니다. 그 이름은 새 9 템플릿에 새 템플릿 1에서 시작하지만 imageViews가 중복됩니다 내가 위로 스크롤 할 때 N 아래로 여기

스크린 샷

나는 당신의 imageDownloadersetImageResource를 호출하는 것으로 의심

enter image description here

+0

무슨 일이 일어나고 있는지 스크린 샷을 제공 할 수 있습니까? – HandlerExploit

+0

@HandlerExploit 제 질문을 업데이트 해주세요. – Hunt

답변

4

(또는 동등 물 - 당신이 setBackgroundResource를 처음에 부르는 동안 ImageViewsrc 속성을 설정하고 있습니다). 그것은 중복을 설명 할 것입니다. 다운로드가 걸리는 경우

if(data.getTemplateIconId()!=0 && data.getTemplateIconUrl()==null){ 

       Log.d("Load icon ","Default Load"); 

       // This line should say setImageResource: 
       holder.templateIcon.setBackgroundResource(data.getTemplateIconId()); 
} else ... 

이 @Akos가 (자신이 삭제 된 것으로 표시되는) 언급하는 것이 문제가 당신을 위해 문제가 될 것입니다 : 당신이해야 할 일은

다음 코드에서 setImageResource로 변경 setBackgroundResource입니다 오랜 시간이 걸리고 이미보기가 다시 사용되었습니다. 그가 말한 것을 다시 한번 말하면, 위의 솔루션을 통해이 작업을 수행하면 이미지 다운로드가 오래 걸리므로 (행이 이미 다시 사용되고 새로운 이미지 세트가있을 수 있음) 이미지가 나타날 수 있습니다 오래된 이미지로 덮어 씁니다.

imageView.setTag(url); 

을 한 후 다운로드가 완료된 후 ImageView의 이미지를 설정하기 전에 :

따라서, imageDownloader의 내부에 당신은 또한 다운로드하기 전에, 말하고 싶은 것

if(!(String)imageView.getTag().equals(url) 
{ 
    return; 
} 

이 방법 그 동안에 다른 행에서 ImageView을 다시 사용하면 다운로드가 중단됩니다.

+0

ImageDownloader 클래스에서 사용 하시겠습니까? if (this == bitmapDownloaderTask) || (모드! = Mode.CORRECT)) { \t \t 문자열 temp = (문자열) imageView.getTag(); \t if (! temp.equals (url)) { \t \t \t \t return; \t} imageView.setImageBitmap (비트 맵); } ' – Hunt

+0

예. 나는 당신의 외부'if()'문장이 무엇인지 모르겠다. 그러나 나는 그것만이 인프라라고 가정 할 것이다. ImageView에 있어야하는 이미지가 다운로드 한 이미지가 아니라면 내부 if()는 이미지를 설정하기 전에 종료됩니다. –

관련 문제