Пользовательский ArrayAdapter + ListView, некоторые строки обрабатываются некорректно - PullRequest
1 голос
/ 03 апреля 2012

Этот пост будет тяжелым для изображений.

Я создал собственный ArrayAdapter и использовал его в Listview.Я что-то упустил здесь на адаптере?

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
      View row = convertView;
      ArrayHolder holder = null;

      if(row == null)
      {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new ArrayHolder();
        holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
        row.setTag(holder);
     }
     else
     {
        if(position % 2 == 0){row.setBackgroundColor(Color.DKGRAY);}
        else{row.setBackgroundColor(Color.BLACK);}

        Typeface font1 =Typeface.createFromAsset(context.getAssets(),"fonts/kingrich.ttf");
        ((TextView)row.findViewById(R.id.txtTitle)).setTypeface(font1);
        ((TextView)row.findViewById(R.id.txtTitle)).setTextColor(Color.rgb(153, 255, 102));

        holder = (ArrayHolder)row.getTag();

    }

    String array = data.get(position);
    holder.txtTitle.setText(array);
    return row;
  }

При первом запуске приложения отображается следующий экран: (экраны представляют собой фактическое устройство, а не эмулятор)

После инициализации приложения

Теперь, если я закрою виртуальную клавиатуру кнопкой «Назад», в нижней части я уже вижу, что одна строка теперь окрашена неправильно, когда я немного прокручиваю вниз:

Прокрутите немного вниз, чтобы увидеть «плохую» строку

Если прокрутить вверх и вниз, строка получит правильную окраску.

Спасибо зазаранее

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

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

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

Строка окрашивается правильно после прокрутки вверх / вниз, потому что теперь у вас есть представления для повторного использования, и поэтому вы будетевведите блок else.

Имхо, вы должны полностью удалить ключевое слово else. Таким образом, вы будете вводить if (где вы создаете новое представление) только в случае необходимости, но в противном случае вы всегда будете ставитьправильный цвет, даже если вид новый и не переработан.

Попробуйте и скажите, работает ли он

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  View row = convertView;
  ArrayHolder holder = null;

  if(row == null)
  {
    LayoutInflater inflater = ((Activity)context).getLayoutInflater();
    row = inflater.inflate(layoutResourceId, parent, false);
    holder = new ArrayHolder();
    holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
    row.setTag(holder);
 }
//this part must be executed every time, not only for recycled views
  if(position % 2 == 0){row.setBackgroundColor(Color.DKGRAY);}
  else{row.setBackgroundColor(Color.BLACK);}

  Typeface font1 = Typeface.createFromAsset(context.getAssets(),   "fonts/kingrich.ttf");
  ((TextView)row.findViewById(R.id.txtTitle)).setTypeface(font1);
  ((TextView)row.findViewById(R.id.txtTitle)).setTextColor(Color.rgb(153, 255, 102));

  holder = (ArrayHolder)row.getTag();



  String array = data.get(position);
  holder.txtTitle.setText(array);
  return row;
}
0 голосов
/ 03 апреля 2012

Не помещайте оставшийся код в остальную часть if (row == null):

 @Override
   public View getView(int position, View convertView, ViewGroup parent) {
      View row = convertView;
      ArrayHolder holder = null;

      if(row == null)
      {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new ArrayHolder();
        holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
        row.setTag(holder);
     }

        if(position % 2 == 0){row.setBackgroundColor(Color.DKGRAY);}
        else{row.setBackgroundColor(Color.BLACK);}

        Typeface font1 = Typeface.createFromAsset(context.getAssets(),   "fonts/kingrich.ttf");
        ((TextView)row.findViewById(R.id.txtTitle)).setTypeface(font1);
        ((TextView)row.findViewById(R.id.txtTitle)).setTextColor(Color.rgb(153, 255, 102));

        holder = (ArrayHolder)row.getTag();



    String array = data.get(position);
    holder.txtTitle.setText(array);
    return row;
  }

textView txtTitle не окрашивается, , потому что блок else пропускается, так как у списка нет переработанных представлений.

А когда вы прокручиваете вверх / вниз, начинается переработка представлений , и вы можете перейти к другой части. Лучше удалить спящую часть целиком, так как вы хотите, чтобы текстовые представления были цветными независимо от того, было ли значение convertview нулевым или нет.

...