2010-07-21 4 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

ну, если вы хотите изменить одну конкретную строку, вы должны иметь способ ее идентифицировать. Либо идентификатор, либо свойство объекта в адаптере, либо если вы знаете его позицию ... Вы понимаете, что я имею в виду? – Sephy

+0

У меня была та же проблема, что и вы, удалось решить ее сегодня. Проверьте мой вопрос и ответ [здесь] (http://stackoverflow.com/questions/4134875/android-listactivity-row-color-based-on-object-state/4148745#4148745). – Holm

ответ

3

так что андроид повторно использует просмотр каждый раз, поэтому вы видите, что он влияет на все строки. Вам нужно явно указать цвет для каждого случая. возможно, добавьте случай «по умолчанию» в ваш оператор switch, чтобы он устанавливал его на все, что вы по умолчанию, в макете?

+0

привет! танков для ответа. Я не уверен, как я могу это сделать. Я понимаю, что изменение цвета строк явно решит проблему ... но я понятия не имею, как это сделать. – user398036

+0

, если вы добавите случай «по умолчанию:» в оператор switch и вызовите label.setTextColor() там, он должен сделать трюк для вас. в основном, я имею в виду, что если вы собираетесь делать то, что влияет только на определенные строки, тогда вам нужно обрабатывать и другие строки. т.е. а не делать этого: 'если (позиция == MY_SPECIAL_ROW) {// SetTextColor() }' вы должны делать вместо этого: 'если (позиция == MY_SPECIAL_ROW) { // setTextColor() } else { // setDefaultTextColor(); } – Ben

-1

Обнаружено несколько странных вещей о ArrayAdapter. Метод getView() получает вызов более одного раза, когда вы добавляете что-то в адаптер. Он получает вызов для каждого элемента в ArrayAdapter, который является странным. Вот почему case-switch не работает. Когда он перебирается по всему списку, он все равно будет в том же состоянии. Решение состоит в том, чтобы найти ваши специальные строки, как предложил Бен. Нравится:

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

Я нахожу это странным, но, возможно, так оно и было реализовано.

+1

Это действительно плохой совет. Никогда не печатайте цвета в позициях в списке. – chubbsondubs

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.

Как правило, правильная практика получения информации, используемой для принятия решений относительно объекта строки.

Смежные вопросы