我建议扩展 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