2012-07-02 107 views
0

是否有可能爲(動態)ListView中的不同行設置不同的顏色?彩色列表查看

我知道我可以設置背景顏色,例如在項目點擊事件監聽器,但我不知道是否有一種方法來動態設置顏色,同時添加項目到適配器?

不好嗎?

itemAdapter = new ArrayAdapter<Bundle>(this, android.R.layout.simple_list_item_1, itemArray) { 
     @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
       View row; 
       LayoutInflater inflater = (LayoutInflater)getSystemService 
        (Context.LAYOUT_INFLATER_SERVICE); 

       if (null == convertView) { 
        row = inflater.inflate(android.R.layout.simple_list_item_1, null); 
       } else { 
        row = convertView; 
       } 

       row.setBackgroundColor(getItem(position).getInt("color")); 
       TextView tv = (TextView) row.findViewById(android.R.id.text1); 
       tv.setText(getItem(position).getString("text")); 

       return row; 
      } 
    }; 

回答

2

您必須編寫自己的自定義ListAdapter。如果數據是數組或ArrayList,則可以簡單地擴展ArrayAdapter,並覆蓋getView()方法。上有寫getView()實施答案豐富,但對於特定的問題的基本答案是,你要增加一些邏輯:

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

    //do initialization work with the convertView 

    if(/*some logic determining whether the view should be colored*/) { 
     convertView.setBackgroundColor(myColor); 
    } else convertView.setBackgroundColor(defaultColor); 
} 

要記住的重要事情是設置它回其他顏色(如果它不符合邏輯標準),因爲視圖被回收並重新使用,否則可能處於意外狀態。

+1

只是爲了擴大這一點,因爲在聊天中提到這是爲了區分發送和接收的消息。你也應該爲你的適配器重寫'add()'。讓它可以傳遞一個標誌,然後將該標誌附加到適配器的某種內部'List'中。然後,在你的'getView()'方法中,你可以做一個邏輯檢查if(list.get(pos)== MESSAGESENT)backgroundColor1 else backgroundColor2'。 –

+0

稍微更正:不需要重寫'add()'。您可以使用'getItem(pos)'代替。 –

+0

好的。所以,而不是ArrayAdapter 我應該有ArrayAdapter 或ArrayAdapter 來容納額外的數據?附:在我看到你的兩條消息之前,我寫到了@Atlos。但是這不僅僅是讓ArrayAdapter 足夠嗎? – Uhehesh