2010-07-21 101 views
3

我試圖根據不同的狀態更改特定行上的顏色。這是我目前的代碼。更改ArrayAdapter ListView中的特定行Android

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

    View row=convertView; 

    if (row==null) {              
     LayoutInflater inflater=getLayoutInflater(); 

     row=inflater.inflate(R.layout.doit, parent, false); 
    } 

    TextView label = (TextView) row.findViewById(R.id.mess); 

    label.setText(ArrayAdapter.getItem(position)); 

    switch(mState){ 
    case STATE1: 

     label.setTextColor(Color.WHITE); 
     break; 
    case STATE2: 
     label.setTextColor(Color.BLACK); 
     break; 
    case STATE3: 
     label.setTextColor(Color.YELLOW); 
     break; 
    } 


    return(row); 
} 

}

代碼還挺works..but它改變了所有行。有任何想法嗎?

+0

好吧,如果你想改變一個特定的行,你必須有一種方法來識別它。通過適配器中的對象的id或屬性,或者如果您知道它的位置......您是否明白我的意思? – Sephy 2010-07-21 14:59:58

+0

我和你有同樣的問題,今天早些時候設法解決它。看看我的問題和答案[這裏](http://stackoverflow.com/questions/4134875/android-listactivity-row-color-based-on-object-state/4148745#4148745)。 – Holm 2010-11-10 20:52:20

回答

3

so android每次都重複使用View,這就是爲什麼你會看到它影響所有行。你需要做的是明確設置每種情況下的顏色。也許可以在switch語句中添加一個「默認」的例子,以便將它設置爲佈局中的默認值。

+0

嗨!坦克爲answear。我不知道我該如何做到這一點。我明白,明確更改行顏色將解決問題...但我不知道該怎麼做。 – user398036 2010-07-21 17:22:18

+0

如果你在你的switch語句中添加一個'default:'的情況,並且在那裏調用label.setTextColor(),它應該爲你做竅門。基本上我的意思是說,如果你要做的事情隻影響某些行,那麼你還需要處理其他行。 即 而不是做這樣的: '如果(位置== MY_SPECIAL_ROW){// setTextColor() }' 你應該做的,而不是這樣做: '如果(位置== MY_SPECIAL_ROW){ // setTextColor() } else { // setDefaultTextColor(); } – Ben 2010-07-21 21:44:46

-1

發現了一些關於ArrayAdapter的奇怪的事情。在向適配器添加內容時,getView()方法會多次調用。它正在調用ArrayAdapter中的每個項目,這很奇怪。這就是案例切換不起作用的原因。當它遍歷整個列表時,它仍然處於相同的狀態。解決方案是找到像Ben建議的特殊行。像:

if (position == 2){ //Row 3 will be red 
label.setTextColor(Color.RED) 
} 

我覺得這很奇怪,但也許這是他們如何實現它。

+1

這真是一個糟糕的建議。切勿將您的顏色硬編碼到列表中的位置。 – chubbsondubs 2010-09-16 04:05:00

1

mState從哪裏來?我沒有看到它來自對象,那麼它將如何改變價值?如果它不能改變值,因爲每行調用getView(),那麼顏色不能改變。我期望像下面這樣:

MyItem item = getItem(position); 
switch(item.getState()) { 
    case STATE_1: 
     label.setTextColor(R.color.white); 
     break; 
    case STATE_2: 
     label.setTextColor(R.color.red); 
     break; 
    case STATE_3: 
     label.setTextColor(R.color.green); 
     break; 
    default: 
     label.setTextColor(R.color.black); 
     break; 
} 

記住奔說,你必須重新設置的顏色,所以如果你的行不能在1,2,或3狀態,你需要一個默認的分支添加到你的switch語句。

從行對象獲取用於製作渲染決策的信息通常是一種很好的做法。

相關問題