Динамически изменять цвет шрифта TextView в ListView

Я привязываю 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); } } 

Solutions Collecting From Web of "Динамически изменять цвет шрифта TextView в ListView"

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

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

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

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