我會建議延長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'對象。 –
你能指點我一個例子嗎? –