我会建议延长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
感谢 - 这是有道理的,但我会如何访问'TextView'在我上面给出的代码?我会不得不手动填充ArrayAdapter吗? –
我通常创建我自己的适配器类。在那个类中你可以访问一个'View'对象。 –
你能指点我一个例子吗? –