0

我正在尝试制作一个 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);
    }
}

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

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

4

2 回答 2

3

我建议扩展 BaseAdapter,它相对容易做并且在涉及各种视图/行布局时非常有用(包括更改 TextView 的颜色)

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

这可能根本不是您的目标,但很容易知道。

但是,我相信您将需要一个 custom 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,同时反映正在显示的行/转换视图。(本身非常有用)。您需要做的就是以相同的方式引用当前的 ViewHolder 并使用 setTextColor() 方法。

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

PS 有关 ListViews 和适配器如何组合在一起的更多信息(考虑getView()这里的方法),本教程非常有帮助..

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

于 2012-12-20T23:48:38.040 回答
0

我认为你可以使用类中setTextColor()声明的方法TextView在此处查看文档。

我假设动态颜色是指以编程方式修改TextViews 的颜色。

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

于 2012-12-20T22:25:13.730 回答