Android:具有动态颜色的ListView

时间:2012-12-20 22:22:54

标签: java android android-layout

我正在尝试制作一个ListView,它代表一列火车线,每条线都有不同的颜色。所以目前我有这个:

public class TrainOverview extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
            R.layout.list_item, R.id.label, TrainLines.lines);
        this.setListAdapter(arrayAdapter);
    }
}

list_item XML只包含线性布局中的两个文本标签,其中一个我希望能够动态更改颜色。 TrainLines.lines目前仅为String[],但我想将其设为一个非常简单的类,其中包含namecolour属性。然后,我希望能够创建一个ListView,显示列车线的名称和适当的颜色。

实现这一目标的最佳方法是什么?我希望我的问题有道理!

2 个答案:

答案 0 :(得分:3)

我建议扩展BaseAdapter,这对于各种视图/行布局(包括改变TextView的颜色)来说相对容易,非常有用

方法getViewTypeCount()getItemViewType(position)可以轻松覆盖,为您提供尽可能多的不同行布局。

这可能不是你的目标,但是要知道这一点很方便。

但是,我相信您需要一个自定义BaseAdapter,您可以在其中覆盖getView(int position, View convertView, ViewGroup parent)方法。

如上所述,这将允许您访问每行的TextView。解决这个问题的一个好方法是实现ViewHolder模式。

你可以创建一个简单的ViewHolder对象,即。

private static class ViewHolder
{
     TextView textView;
}

然后在覆盖的getView()

中使用它
    // Get that view
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {               
        if (convertView == null)
        {
            if (getItemViewType(position) == 0)
            {
                convertView = inflater.inflate(R.layout.rowlayouta, null);
                viewHolder = new ViewHolder();
                viewHolder.textView = (TextView) convertView.findViewById(R.id.tvCommonText1);
                convertView.setTag(viewHolder);
            }
            else
            {
                convertView = inflater.inflate(R.layout.rowlayoutb, null);
                viewHolder = new ViewHolder();
                viewHolder.textView = (TextView) convertView.findViewById(R.id.tvCommonText2);
                convertView.setTag(viewHolder);
            }
        }

        else 
            viewHolder = (ViewHolder) convertView.getTag(); // Or if View is existing

        viewHolder.textView.setText(strings.get(position));

        return convertView;         
    }   

这只是我如何夸大两种不同行布局的一个例子,你可以拿出第一个其他行。

您可以看到,如果现在有ViewHolder对象分配给该行,则会创建一个新的ViewHolder对象,其TextView设置为当前convertView的引用 - 实际上是当前行View。然后,现在包含对特定行TextView的引用的ViewHolder对象基本上使用setTag(object)方法附加到该convertView /行。

如果它已经有标记,则使用getTag()方法获取该标记,而不是使用新引用创建新对象。最重要的是,没有新观点被夸大,旧观点只是被重用。

然后,您可以通过引用当前ViewHolder对象来设置所需的TextView属性,该对象保存对该特定TextView的引用。

正如您所看到的,我将文本更改为每个TextView,因为我一直在反映哪个行/ convertView正在显示。 (非常有用)。您需要做的就是以相同的方式引用当前的ViewHolder并使用setTextColor()方法。

也许这有点过时了。但希望你能够实现你所询问的内容,并且知道为什么它是一个很好的实现。

P.S。有关ListView和适配器如何结合在一起的更多信息(在此考虑getView()方法),本教程非常有用..

http://android.amberfog.com/?p=296

答案 1 :(得分:0)

我认为您可以使用setTextColor()类中声明的TextView方法。查看文档here

我认为动态颜色是指以编程方式修改TextView的颜色。

如果您正在寻找自定义阵列适配器,请参阅this教程。