2010-05-30 43 views
2

如果我想,以紀念我做下面的代碼的第二項的項(改變背景顏色): 此代碼是從我的適配器,擴展ArrayAdapter:當標誌着ListView中它重複其他項目

if (convertView == null) { 
     LayoutInflater mInflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = mInflater.inflate(R.layout.channel_list, null); 
    } 

    MyContent o = items.get(position); 
    if (o != null) { 
     TextView tt = (TextView) convertView.findViewById(R.id.toptext); 
     TextView bt = (TextView) convertView.findViewById(R.id.bottomtext); 
     if (tt != null) { 
      tt.setText(o.Top());        
     } 
     if(bt != null){ 
      bt.setText(o.Bottom()); 
     } 
     if(position == 2) { 
      convertView.setBackgroundColor(R.color.selectem_color); 
     } 
    } 
    return convertView; 

它會顯示列表視圖,但會在此項目之後的第9個項目(第11項第13等等)標記。

有誰知道是什麼原因?

回答

2

有兩種情況可以調用getView方法。如果converView爲空,則必須創建一個新的視圖。如果它不爲空,那麼由於用戶滾動而離開屏幕的項目將被回收並返回到您的方法以供重用。

此對象是之前列表中顯示的對象。你必須檢查它的狀態並將它的每個屬性設置爲你想要的值。你不能像對象是新的那樣標記對象並且不標記對象。在你的getview方法中做這樣的事情。

if(item is selected) {  
    convertView.setBackgroundColor(selected color); 
} else { 
    convertView.setBackgroundColor(not selected color); 
} 

在你的代碼中,如果缺少else的情況。

+0

嗨,你的回答是正確的,但它不能解決它。回收的元素現在獲得了不同的位置,但這是方向。 謝謝你的回答! – Adi 2010-05-31 13:54:30

+0

對不起阿迪,但我不可能知道你的代碼如何工作。將其更改爲更類似代碼的僞代碼。 重要的是,你不能相信convertView是一個乾淨的新對象,它也可能是一個適配器之前更改過的對象。 – Janusz 2010-05-31 14:12:07

+0

適用於帶有「convertView.setBackgroundResource」..但不適用於顏色的圖像 我認爲它可能與繪圖緩存相關 – Adi 2010-05-31 14:32:34

3

您沒有重置背景顏色。請記住,行被回收 - 這就是convertView的用途。只需添加一個else {}即可將顏色設置爲position不是2時的任何正常狀態,並且您將會好起來。

+0

+1的工作方案:d – RoflcoptrException 2010-05-30 18:44:18

+0

現在嘗試它 謝謝:) – Adi 2010-05-30 19:03:02

+0

我想要的默認顏色 時convertView不爲空,我試過 如果{ 回報convertView;(位置= 2!) } 沒有幫助 也沒有返回語句(並插入默認顏色)沒有幫助 – Adi 2010-05-30 19:56:02