2012-12-20 43 views
0

我试图做一个列表视图,它代表列车行,每列都有不同的颜色。因此,在现阶段,我有这样的:Android:具有动态颜色的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属性。然后,我希望能够创建一个列表视图,显示列车行的名称和适当的颜色。

达到此目的的最佳方法是什么?我希望我的问题有道理!

回答

0

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

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

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

+0

感谢 - 这是有道理的,但我会如何访问'TextView'在我上面给出的代码?我会不得不手动填充ArrayAdapter吗? –

+0

我通常创建我自己的适配器类。在那个类中你可以访问一个'View'对象。 –

+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/row。

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

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

正如你所看到的,我将文本更改为每个TextView,因为我沿着它反映显示哪一行/ convertView。 (本身很有用)。所有你需要做的就是以同样的方式引用当前的ViewHolder,并使用setTextColor()方法。

也许这是有点画出来。但希望你能够实现你所问的问题,并且你知道为什么这是一个很好的实现。

P.S.有关列表视图和适配器是怎么走到一起(的getView()方法的思维在这里)更多的信息,本教程是非常有益的..

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