动态更改 ListView 中的 TextView 字体颜色

Posted

技术标签:

【中文标题】动态更改 ListView 中的 TextView 字体颜色【英文标题】:dynamically change TextView font color in ListView 【发布时间】:2011-10-31 11:00:14 【问题描述】:

我正在将 XML 文档绑定到自定义适配器。列表中的所有项目最初都具有白色字体颜色。 XML 文档中的一个节点有一个我正在检查的属性,如果设置了该属性,我想将 ListView 中该项目的字体颜色更改为较深的颜色。我的代码最初似乎可以工作,但是如果我上下滚动列表,ListView 中应该保持白色的项目会自动变为深色,出于某种原因:

这是我的布局代码:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
 android:orientation="vertical">
 <TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/text"
    android:layout_
    android:layout_ 
    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);
    

【问题讨论】:

【参考方案1】:

ListView 重用视图,正如您在getView 中看到的那样,您获得了 convertView,并且您只会将颜色从白色更改为灰色。您永远不会将颜色恢复为白色。我建议

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

【讨论】:

那行得通。看到解决方案后似乎很简单。谢谢!【参考方案2】:

将文本和颜色设置代码移动到设置标签之前。试试这个代码

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

【讨论】:

以上是关于动态更改 ListView 中的 TextView 字体颜色的主要内容,如果未能解决你的问题,请参考以下文章

从android中的对话框更改TextView文本

TextView 更改适用于使用 ListView 和 ArrayAdapter 的多个 TextView

从ArrayAdapter每毫秒更新Android ListView中的一行

在 ListView 适配器的 getView(...) 中更改 TextView 颜色和文本

Android ListView 内置TextView动态改变其背景颜色

如何使用 swift 中的按钮点击动态更改 textview 中的字体?