2012-12-20 45 views
0

我試圖做一個列表視圖,它代表列車行,每列都有不同的顏色。因此,在現階段,我有這樣的:Android:具有動態顏色的ListView

public class TrainOverview extends ListActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, 
      R.layout.list_item, R.id.label, TrainLines.lines); 
     this.setListAdapter(arrayAdapter); 
    } 
} 

list_item XML只是一種線性佈局兩個文本標籤,其中一個我希望能夠改變的動態的顏色。 TrainLines.lines目前只是一個String[],但我想使它成爲一個非常簡單的類,具有namecolour屬性。然後,我希望能夠創建一個列表視圖,顯示列車行的名稱和適當的顏色。

達到此目的的最佳方法是什麼?我希望我的問題有道理!

回答

0

我認爲你可以使用TextView類中聲明的setTextColor()方法。檢查文檔here

我假定動態顏色是指以編程方式修改TextView的顏色。

如果您正在尋找自定義陣列適配器,請參閱this教程。

+0

感謝 - 這是有道理的,但我會如何訪問'TextView'在我上面給出的代碼?我會不得不手動填充ArrayAdapter嗎? –

+0

我通常創建我自己的適配器類。在那個類中你可以訪問一個'View'對象。 –

+0

你能指點我一個例子嗎? –

3

我會建議延長BaseAdapter,這是比較容易做到的和非常有用,當涉及到不同的意見/行佈局(包括TextView的顏色變化)

的方法getViewTypeCount()getItemViewType(position)可以很容易地被覆蓋的給你儘可能多的不同的行佈局,只要你喜歡。

這可能不是你的目標,但知道這是一個方便的事情。

但是,我相信您需要一個自定義BaseAdapter,其中您覆蓋了getView(int position, View convertView, ViewGroup parent)方法。

這將允許您像上面提到的那樣訪問每行的TextView。一個很好的方法是通過實現ViewHolder模式。

你可以創建一個簡單的ViewHolder對象,即。

private static class ViewHolder 
{ 
    TextView textView; 
} 

然後使用你的被覆蓋的getView()

// Get that view 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    {    
     if (convertView == null) 
     { 
      if (getItemViewType(position) == 0) 
      { 
       convertView = inflater.inflate(R.layout.rowlayouta, null); 
       viewHolder = new ViewHolder(); 
       viewHolder.textView = (TextView) convertView.findViewById(R.id.tvCommonText1); 
       convertView.setTag(viewHolder); 
      } 
      else 
      { 
       convertView = inflater.inflate(R.layout.rowlayoutb, null); 
       viewHolder = new ViewHolder(); 
       viewHolder.textView = (TextView) convertView.findViewById(R.id.tvCommonText2); 
       convertView.setTag(viewHolder); 
      } 
     } 

     else 
      viewHolder = (ViewHolder) convertView.getTag(); // Or if View is existing 

     viewHolder.textView.setText(strings.get(position)); 

     return convertView;   
    } 

這只是我怎麼充氣兩個不同的行佈局的例子,你可以只取出第一人。

您可以看到,如果現在將ViewHolder對象分配給該行,則會創建一個新的ViewHolder對象,將其TextView設置爲當前convertView的引用 - 實際上是當前行的View。然後,現在包含對特定行TextView的引用的ViewHolder對象基本上使用setTag(object)方法附加到convertView/row。

如果它已經有一個標記,那麼使用getTag()方法獲得該標記,而不是使用新引用創建一個新對象。最重要的是,沒有新的觀點被誇大,舊的觀點被重用。

然後,您可以通過引用保留對特定TextView的引用的當前ViewHolder對象來設置所需的TextView屬性。

正如你所看到的,我將文本更改爲每個TextView,因爲我沿着它反映顯示哪一行/ convertView。 (本身很有用)。所有你需要做的就是以同樣的方式引用當前的ViewHolder,並使用setTextColor()方法。

也許這是有點畫出來。但希望你能夠實現你所問的問題,並且你知道爲什麼這是一個很好的實現。

P.S.有關列表視圖和適配器是怎麼走到一起(的getView()方法的思維在這裏)更多的信息,本教程是非常有益的..

http://android.amberfog.com/?p=296