2012-08-16 49 views
3

我正在創建一個ListView,其中TextViewImageView作爲列表項行。ImageView在現有ListVIew中添加更多項目時重疊

最初我加載從本地數據庫默認項在ListView觀點和我對列表視圖頂部從服務器

加載多個項目的update button當用戶按下一個update button我正在燒製AsyncTask其拉來自服務器的圖標URL和文本

在ImageView中加載圖標我使用樣本ImageDownloader,但問題是我的ImageView與ViewHolder模式的舊ImageViews bcoz重疊。所以有人會傾訴我我做錯了什麼?

,這裏是我的ListView適配器代碼

@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。 請隨時詢問是否有人想要更多信息。

編輯

下面是屏幕截圖

最初將有8個模板&它的圖標,它可從存儲在只有一款Android手機數據庫加載。它的名字開始從模板1至模板6

default view

現在,當用戶按下更新按鈕新模板將在這裏被加載。它的名字從模板創建新1開始模板創建新9但imageViews被重疊時,我向上滾動N個了

這裏是屏幕截圖

enter image description here

+0

你能提供正在發生的事情的截圖嗎? – HandlerExploit 2012-08-17 19:42:22

+0

@HandlerExploit我已經更新了我的問題請看看它 – Hunt 2012-08-17 20:44:52

回答

4

我懷疑你imageDownloader呼喚setImageResource(或相當於 - 它在設置src屬性)ImageView,而您最初呼叫setBackgroundResource。這將解釋重疊。

你需要做的是改變setBackgroundResourcesetImageResource在下面的代碼:

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提到(他似乎已刪除)的問題將是你的問題,如果下載需要很長一段時間,這個觀點已經被重用。爲了重申他所說的話,一旦通過上述解決方案得到了這個工作,您會發現如果圖像下載需要很長時間(只要該行已經被重用,並且新圖像集),那麼您的圖像可能是用舊圖像覆蓋。

因此,imageDownloader裏面你也想下載前說,:

imageView.setTag(url); 

,然後在下載完成後,之前在ImageView設置圖像:

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

這樣,如果在此期間ImageView已被另一行重新使用,則下載將簡單地中止。

+0

你的意思是在一個ImageDownloader類中,我應該將它設置爲'if((this == == bitmapDownloaderTask)||(mode!= Mode.CORRECT)){ \t \t String temp =(String)imageView.getTag(); (!temp.equals(url)) \t \t \t \t return; \t} imageView.setImageBitmap(bitmap); }' – Hunt 2012-08-18 19:58:46

+0

是的。我不確定你的外部'if()'語句是什麼,但我只是假設這是基礎設施。如果發現應該在「ImageView」中的圖像不是它下載的圖像,內部'if()'將在設置圖像之前退出。 – 2012-08-20 14:57:05