Изменить определенную строку в ArrayAdapter ListView Android - PullRequest
3 голосов
/ 21 июля 2010

Я пытаюсь изменить цвет в определенной строке в зависимости от различных состояний.Это код, который у меня есть на данный момент.

 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);
 }

}

Код вроде работает ... но он меняет все строки.Есть идеи?

Ответы [ 3 ]

3 голосов
/ 21 июля 2010

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

1 голос
/ 16 сентября 2010

Откуда приходит 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.

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

0 голосов
/ 22 июля 2010

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

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

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

...