динамически изменять цвет шрифта TextView в ListView - PullRequest
6 голосов
/ 21 августа 2011

Я связываю документ XML с пользовательским адаптером. Все элементы в списке изначально имеют белый цвет шрифта. У одного из узлов в документе XML есть атрибут, который я проверяю, и если атрибут установлен, я хотел бы изменить цвет шрифта этого элемента в ListView на более темный цвет. Код, который у меня есть, кажется, изначально работает, но если я прокручиваю список вверх и вниз, элементы в ListView, которые должны оставаться белыми, по какой-то причине автоматически меняют на темный цвет:

Вот мой код компоновки:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
 android:orientation="vertical">
 <TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/text"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:textSize="15dip" 
    android:textColor="#ffffff"
    android:textStyle="bold"
    android:padding="5px"
     />
 </LinearLayout>

и вот мой пользовательский адаптер:

 private class CustomAdapter extends BaseAdapter 
 {       
    private ArrayList<FilterItem> mData = new ArrayList<FilterItem>();
    private LayoutInflater mInflater;

    public CustomAdapter() {
        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void addItem(FilterItem item) {
        mData.add(item);
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Object getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ViewHolder holder;
        FilterItem item = (FilterItem)this.getItem(position);

        if (convertView == null)
        {

            holder = new ViewHolder();

            convertView = mInflater.inflate(R.layout.main, null); 
            holder.text = (TextView)convertView.findViewById(R.id.text);

            convertView.setTag(holder);

        } else {
            holder = (ViewHolder)convertView.getTag();
        }

            TextView tvText = holder.text;

            tvText.setText(item.getTitle());

            if (item.Read())
            {
                tv.setTextColor(Color.Gray);
            }

        return(convertView);
    }
}

Ответы [ 2 ]

17 голосов
/ 21 августа 2011

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

if (item.Read()) {
    tv.setTextColor(Color.Gray);
} else {
    tv.setTextColor(Color.White);
}
1 голос
/ 21 августа 2011

Переместите код настройки текста и цвета в положение до установки тега.Попробуйте этот код

 if (convertView == null)
    {

        holder = new ViewHolder();

        convertView = mInflater.inflate(R.layout.main, null); 
        holder.text = (TextView)convertView.findViewById(R.id.text);
        TextView tvText = holder.text;
        tvText.setText(item.getTitle());
        if (item.Read())
        {
           tv.setTextColor(Color.Gray);
        }
        convertView.setTag(holder);

    } else {
        holder = (ViewHolder)convertView.getTag();

        TextView tvText = holder.text;
        tvText.setText(item.getTitle());
        if (item.Read())
        {
            tv.setTextColor(Color.Gray);
        }
    }
    return(convertView);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...