2011-08-21 5 views
6

Я привязываю XML-документ к пользовательскому адаптеру. Все элементы в списке изначально имеют цвет шрифта белого цвета. Один из узлов в документе XML имеет атрибут, который я проверяю, и если атрибут установлен, я хотел бы изменить цвет шрифта этого элемента в ListView на более темный цвет. Код, который у меня есть, кажется, работает изначально, но если я прокручиваю список вверх и вниз, элементы в ListView, которые должны оставаться белыми, автоматически меняются на темный цвет, по какой-то причине:динамически меняет цвет шрифта TextView в 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); 
    } 
} 

ответ

16

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

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

который работал. кажется таким простым после просмотра решения. благодаря! –

1

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

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); 
Смежные вопросы