我正在尝试制作一个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[]
,但我想将其设为一个非常简单的类,其中包含name
和colour
属性。然后,我希望能够创建一个ListView,显示列车线的名称和适当的颜色。
实现这一目标的最佳方法是什么?我希望我的问题有道理!
答案 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()
方法),本教程非常有用..
答案 1 :(得分:0)