2015-02-12 29 views
0

我有我的列表視圖,我使用視圖持有人模式的自定義基礎適配器。我必須動態更改多個圖像的來源。但是當我更換其中一幅圖像後,幾幅滾動整幅圖像發生了變化。如果我只是刪除視圖持有人模式,一切都很好。setImageResource()同時使用視圖持有人模式與列表視圖

我喜歡搜索一些問題:Facing critical issue: Toggle image source inside Listview using ViewHolder Pattern

但我無法找到一個合適的辦法一舉兩得。

這是我的getview()函數。

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

     ViewHolder holder; 

//  if (convertView == null) { 

      holder = new ViewHolder(); 
      convertView = this.inflater.inflate(R.layout.list_row2, parent, false); 

      // For every single item placed on XML 
      // Holder must be updated here 
      holder.codeName = (TextView) convertView.findViewById(R.id.codeName); 
      holder.level = (TextView) convertView.findViewById(R.id.level); 
      holder.pt1 = (TextView) convertView.findViewById(R.id.pt1Value); 
      holder.pt2 = (TextView) convertView.findViewById(R.id.pt2Value); 
      holder.tt3 = (TextView) convertView.findViewById(R.id.tt3Value); 
      holder.tt4 = (TextView) convertView.findViewById(R.id.tt4Value); 
      holder.lastUpdate = (TextView) convertView.findViewById(R.id.lastUpdate); 
      holder.status = (ImageView) convertView.findViewById(R.id.status); 
      convertView.setTag(holder); 

//  } 

//  else { 
//   holder = (ViewHolder) convertView.getTag(); 
//  } 



     // Formatting level 
     SingleSystem temp = sys.get(position); 
     temp.seq1 = temp.seq1.replace("," , "."); 
     Float tempLevel = Float.parseFloat(temp.seq1); 
     Integer level = Math.round(tempLevel); 


     //Check if there is an alert on system 
     if(temp.seq13.contains("1") || temp.seq14.contains("1") || 
      temp.seq16.contains("1") || temp.seq30.contains("1") || temp.seq31.contains("1") || temp.seq32.contains("1") || 
      temp.seq45.contains("1") ) 
     { 
      holder.status.setImageResource(R.drawable.process_warning); //If an alert, change running picture 
     } 

     //Set background color according to level 
     if(level<=15){ 
      holder.level.setBackgroundColor(Color.rgb(255,17,0)); 
      holder.status.setImageResource(R.drawable.offline); 


     } 
     else if(level>15 && level <30){ 
      holder.level.setBackgroundColor(Color.rgb(255,128,0)); 

     } 
     else{ 
      holder.level.setBackgroundColor(Color.rgb(66,213,4)); 
     } 

     // Check Time Out 
     SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); 

     try { 
      Date serverTime = dateFormat.parse(temp.serverTime); 
      Date communicationTime = dateFormat.parse(temp.communicationDate); 
      long diff = serverTime.getTime() - communicationTime.getTime(); 
      diff = diff/1000; 
      diff = diff/60; 
      Integer cOut = Integer.parseInt(temp.communicationTimeOut); 
      if(diff > cOut){ 
       holder.status.setImageResource(R.drawable.offline); 
      } 

     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     } 

     return convertView; 
    } 

正如我所說如果我刪除if(convertView == null)部分,一切都是okey。現在我只有16行,但可能會增加。這將是未來的重大性能問題嗎?我怎樣才能改變我的代碼使用視圖持有者模式?

感謝您的回答。

回答

0

視圖被重用,即。它們具有從之前顯示的所有值/顏色/繪圖。重新使用視圖時,您需要重置圖像的可繪製對象:

else { 
    holder = (ViewHolder) convertView.getTag(); 
    holder.status.setImageDrawable(null); 
} 
+0

就是這樣。非常感謝你。 – SinanAy 2015-02-12 08:29:08