Android: проблема getView () - она ​​меняет элементы при прокрутке - PullRequest
0 голосов
/ 07 июня 2011

Я создал список, в котором есть три вида текста и флажок, и поместил его в BaseAdapter. Что он должен сделать, это если элемент находится в состоянии « непрочитанный », а затем сделать его текстовые просмотры BOLD . Однако я столкнулся с двумя проблемами.

  1. верхний элемент всегда BOLD независимо от того, прочитан он или непрочитан.
  2. Если я делаю прокрутку, то элементы перезагружаются при прокрутке начинают выделяться жирным шрифтом

Я исследовал это, но не смог найти для меня ничего хорошего. Если у кого-нибудь есть идея, не могли бы вы мне помочь? Ниже приведено описание getView ().


public View getView(final int position, View convertView, ViewGroup parent) {
            View view = convertView;
            ViewHolder viewHolder;

            if(convertView == null){ // check if convertView exists
                // get and inflate layout
                view = layoutInflater.inflate(R.layout.row, null);

                viewHolder = new ViewHolder();
                viewHolder.tv1 = (TextView)view.findViewById(R.id.list_callerIDname);
                viewHolder.tv2 = (TextView)view.findViewById(R.id.list_callerIDnumber);
                viewHolder.tv3 = (TextView)view.findViewById(R.id.list_messageSentTime);
                viewHolder.cb = (CheckBox)view.findViewById(R.id.checkBox1);

                // get each CheckBox into cb_array for future use
                this.cb_array[position] = (CheckBox)view.findViewById(R.id.checkBox1);

                // use it as a tag
                view.setTag(viewHolder);
            }
            else{
                viewHolder = (ViewHolder)view.getTag();
            }

            viewHolder.tv1.setText(this.callerIDnames[position]);
            viewHolder.tv2.setText(this.callerIDnumbers[position]);
            viewHolder.tv3.setText(this.messageSentTimes[position]);

            // if message is unread, then make texts bold
            if (messageRead_list[position] == false){
                viewHolder.tv1.setTypeface(viewHolder.tv1.getTypeface(), Typeface.BOLD);
                viewHolder.tv2.setTypeface(viewHolder.tv2.getTypeface(), Typeface.BOLD);
                viewHolder.tv3.setTypeface(viewHolder.tv3.getTypeface(), Typeface.BOLD);
            }

            return view;
        }

Ответы [ 3 ]

1 голос
/ 07 июня 2011

Когда ListView повторно использует представление, оно могло быть выделено жирным шрифтом до прокрутки и теперь должно быть простым.Попробуйте явно установить гарнитуру на PLAIN при чтении сообщения.

0 голосов
/ 07 июня 2011

Вам нужно будет передать null в setTypeFace() вместо использования getTypeFace().

Когда getTypeFace() не возвращает null стиль не будет установлен правильно.

// if message is unread, then make texts bold
if (messageRead_list[position] == false){
    viewHolder.tv1.setTypeface(null, Typeface.BOLD);
    viewHolder.tv2.setTypeface(null, Typeface.BOLD);
    viewHolder.tv3.setTypeface(null, Typeface.BOLD);
} else {
    viewHolder.tv1.setTypeface(null, Typeface.NORMAL);
    viewHolder.tv2.setTypeface(null, Typeface.NORMAL);
    viewHolder.tv3.setTypeface(null, Typeface.NORMAL);
}

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

setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));

и

setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
0 голосов
/ 07 июня 2011

Вы должны использовать два типа счетчиков представлений, реализуя getItemViewType (int position)

как это:

public int getViewTypeCount () {
    return 2;
}

и это:

public int getItemViewType (int position) {
    if (messageRead_list[position] == false) return 0;
    return 1;
}

, а затем проверяете тип элемента при его создании для установки правильной гарнитуры.

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

...