Вводите оба оператора if и else? - PullRequest
3 голосов
/ 20 июля 2010

Итак, у меня есть этот код (обновлен для решения).

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ...
        final Direction d = directions.get(position);
        if (d != null) {

            TextView direction = (TextView) row.getTag(R.id.directionTextView);
            TextView departure1 = (TextView) row.getTag(R.id.departure1);
            TextView departure2 = (TextView) row.getTag(R.id.departure2);
            TextView departure3 = (TextView) row.getTag(R.id.departure3);

            direction.setText(d.getName());

            if (d.getTimeStamps().size() == 0) {
                departure1.setText(R.string.nodepartures);
                departure1.setTextColor(R.color.grey);
            } else {
                for (int i = 0; i < d.getTimeStamps().size(); i++) {
                    switch (i) {
                    case 0:
                        departure1.setText(d.getTimeStamps().get(i));
                        break;
                    case 1:
                        departure2.setText(d.getTimeStamps().get(i));
                        break;
                    case 2:
                        departure3.setText(d.getTimeStamps().get(i));
                        break;
                    default:
                        break;
                    }
                }
            }
        }
        return row;
    }
}

Проблема, с которой я столкнулся, заключалась в том, что один из TextViews станет серым, когда этого не предполагалось. Я пытался исправить это, всегда снова устанавливая текст черным, но каждый из них становился серым. Пока я не попробовал:

setTextColor(context.getResources().getColor(R.color.black));

вместо

setTextColor(R.color.black);

Не знаю, почему последний работает, когда текст серого цвета, но это так. Я думаю, я просто немного отсталый. :)

Ответы [ 7 ]

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

То, что вы думаете, происходит просто не может произойти (*, **). Что вам нужно сделать, это доказать себе, что этого не происходит.

Я бы сделал это, добавив несколько следов в код. Поместите один перед оператором if, один в начале предложений «then» и «else» и один после оператора if. Тогда запустите это. Я ожидаю, что это покажет, что оператор if фактически выполняется дважды, и в первый раз выполняется предложение «then», а во второй раз - предложение «else».

(* Теоретически, это может произойти, если в эмуляторе произошла серьезная ошибка. Но вы должны рассматривать это как возможность, если у вас есть неопровержимые доказательства.)

(** Другая возможность состоит в том, что между приведенным выше примером кода и реальным кодом, который вы тестируете, может существовать существенная разница ... Это происходит ...)

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

AsLanFromNarnia находится на правильном пути.ListView перезаписывает свои дочерние представления.Вы никогда не можете предположить, что convertView находится в каком-либо состоянии по умолчанию для своего типа.Устанавливайте каждое соответствующее поле каждый раз, когда вызывается getView.В вашем случае это означает установку цвета текста при установке текста.

Есть еще один способ обработки таких случаев, когда вы хотите иметь разнородные списки: используйте типы представлений.Ваш адаптер может вернуть количество типов, которые у вас есть для getViewTypeCount, а затем сообщить тип каждого элемента из getItemViewType.Если вы сделаете это, вы всегда получите convertView, переданный в ваш метод getView правильного типа, что избавит вас от необходимости каждый раз менять статическое расположение.

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

Я полагаю, что он становится серым, потому что в какой-то момент в вашей программе метод вызывается с 0 временными метками.

Это должно произойти только один раз, чтобы он установил атрибут escape1.textColor, тогда он будет сохранятьсяпока не вернулся обратно.

Вы упомянули, что пытались установить его черным в операторе else, но он стал серым.Это не имеет смысла вообще.Попробуйте добавить команду, чтобы превратить текст в черный в каждом операторе case, так:

case 0:
departure1.setTextColor(R.color.black);
departure1.setText(d.getTimeStamps().get(i));
break;
case 1:
departure2.setTextColor(R.color.black);
departure2.setText(d.getTimeStamps().get(i));
break;
case 2:
departure3.setTextColor(R.color.black);
departure3.setText(d.getTimeStamps().get(i));
break;
0 голосов
/ 20 июля 2010

Установили ли вы цвет или стиль по умолчанию в XML-файле макета, который загружается LayoutInflator?

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

Исходя из того, что вы описываете, мы можем дать только подсказки в лучшем случае.

  • Вы уверены, что перекомпилировали весь свой код?Я видел, что отладка дает странные результаты, потому что часть кода не была синхронизирована с отладкой байт-кода.
  • Это система, основанная на событиях?Может ли быть так, что ваш код вызывается дважды, один раз с пустым списком, за которым сразу следует список с 1 записью после добавления этой записи в список?

В качестве улучшения кода я бы сделал следующее длярефакторинг switch (предполагается, что тип управления Text, который, вероятно, неверен, но легко исправим):

if (d.getTimeStamps().isEmpty()) {
   departure1.setText(R.string.nodepartures);
   departure1.setTextColor(R.color.grey);
} else {
    Text[] fields = new Text[] { departure1, departure2, departure3 };

    for (int i = 0; i < fields.length && i < d.getTimeStamps().size(); i++) {
        fields[i].setText(d.getTimeStamps().get(i));
        fields[i].setTextColor(R.color.black);
    }
}

обновление

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

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

Я согласен с Aircule! Этот код довольно сумасшедший! Как насчет этого?

if(d.getTimeStamps().isEmpty())
{
   departure1.setText(R.string.nodepartures);
   departure1.setTextColor(R.color.grey);
} 
else
{
   departure1.setText(d.getTimeStamps().get(0));
   departure2.setText(d.getTimeStamps().get(1));
   departure3.setText(d.getTimeStamps().get(2));
}

Он должен делать то же самое, и это намного менее сложно. Кроме того, допустим, вы запустили этот код один раз, и список пуст, поэтому вы установили серый цвет и ушли и снова запустите его. На этот раз вы получите данные и заполните пункты, но вы никогда не измените цвет вылета1, поэтому он останется серым. Точно так же, если вы воспользуетесь этим сценарием, вы не очистите TextViews, когда список пуст. Другой совет: если будет всего три элемента (или любое небольшое фиксированное количество элементов), то вам, вероятно, лучше просто использовать обычный макет вместо списка. Таким образом, вам не придется создавать специальный адаптер, вы можете просто назвать элементы по имени.

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

Хм ... Я не понимаю, как это могло произойти. Вы уверены, что ваши скобки в нужном месте? Это все еще происходит, если вы переключаете оператор?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...