這邊的程式碼延續上一篇文章的結果 , 如果說我們現在想要在ListView中每一個row
所呈現的資料內容更豐富些 , 不單單只有文字還想加入圖片 , 並且選取ListView裡的
資料時能觸發Click事件 , 如下圖TitleBar會顯示我們所選擇的球員
首先我們要自訂ListView中row的資料呈現內容 , 上圖是在左邊擺了一個ImageView然後右上方擺一個TextView , 下方也擺一個TextSize較小的TextView , 為了達成這樣的效果 , 我們必須把想呈現的佈局方式寫在一個Layout xml檔案裡 , 如下
將row裡該呈現的佈局都搞定之後 , 接下來就是程式碼的部分
import android.app.TabActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TabHost;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
public class TabWidgetListViewTest extends TabActivity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
EPlayer = getResources().getStringArray(R.array.EPlayer);
WPlayer = getResources().getStringArray(R.array.WPlayer);
Postion = getResources().getStringArray(R.array.Position);
// 分別將東西區先發球員和球員位置的資料當作ListView 的內容
// res/values/strings.xml 已經宣告了string-array
icons = new int[]{R.drawable.marketplace , R.drawable.email , R.drawable.contacts , R.drawable.mms , R.drawable.application};
// 首先我們先處理ListView所要呈現的內容
ListEPlayer = (ListView) findViewById(R.id.ListViewEast);
ListEPlayer.setAdapter(new IconTextAdapter(this , android.R.layout.simple_list_item_1 , EPlayer , Postion , icons));
ListEPlayer.setOnItemClickListener(OICL);
// 這邊的例子選用原本的範本 android.R.layout.simple_list_item_1
// 然後都丟入我們自己的接收器IconTextAdapter中 , 參數多了一個String[] Position
// 然後再判斷Item點擊事件
ListEPlayer.setTextFilterEnabled(true);
//添加按鍵過濾的功能
ListWPlayer = (ListView) findViewById(R.id.ListViewWest);
ListWPlayer.setAdapter(new IconTextAdapter(this , android.R.layout.simple_list_item_1 , WPlayer , Postion , icons));
ListWPlayer.setOnItemClickListener(OICL);
ListWPlayer.setTextFilterEnabled(true);
//對另一個ListView做同樣的操作載入西區先發球員的資料
mTabHost = getTabHost();
//我們的TabWidgetListViewTest 是繼承 TabActivity的
//所以這邊是透過他的method getTabHost()
//來取得我們在main.xml中宣告的TabHost
mTabHost.addTab(mTabHost.newTabSpec("tab_test1")
//將Tab加入我們要的資料
.setIndicator("東區先發球員" , this.getResources().getDrawable(R.drawable.aemail))
//在Tab上標示名稱和加上Icon
.setContent(R.id.ListViewEast));
//Tab內容為main.xml檔案中宣告的ListView , 而ListView的內容我們先前已經處理好了
mTabHost.addTab(mTabHost.newTabSpec("tab_test2").setIndicator("西區先發球員" , this.getResources().getDrawable(R.drawable.browser)).setContent(R.id.ListViewWest));
mTabHost.setCurrentTab(0);
//預設該顯示哪個Tab的資料
}
TabHost mTabHost;
ListView ListEPlayer , ListWPlayer;
String[] EPlayer , WPlayer , Postion;
int[] icons;
public class IconTextAdapter extends ArrayAdapter
{
int[] icons;
String[] textname , textpostion;
public IconTextAdapter(Context context, int textViewResourceId, String[] itemname, String[] itempostion , int[] images)
{
super(context, textViewResourceId, itemname);
icons = images;
textname = itemname;
textpostion = itempostion;
}
public View getView(int position, View convertView, ViewGroup parent)
{
View rowview = convertView;
if (rowview == null) {
LayoutInflater inflater = getLayoutInflater();
rowview = inflater.inflate(R.layout.listviewrow, parent, false);
//為了要把xml所描述的Layout轉變為View , 也就是我們要的rowview
//所以必須使用LayoutInflater來轉化 , 而要取得LayoutInflater的Instance方式還包括
//LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//接著再使用inflate (int resource, ViewGroup root, boolean attachToRoot)
//傳回我們要的rowview
}
TextView Nmae = (TextView) rowview.findViewById(R.id.name);
Nmae.setText(textname[position]);
TextView Postion = (TextView) rowview.findViewById(R.id.position);
Postion.setText(textpostion[position]);
ImageView icon = (ImageView) rowview.findViewById(R.id.icon);
icon.setImageResource(icons[position]);
// 我們在listviewrow.xml裡已經把ListView中Row的佈局都排好了
// 而這裡的rowview可以想成是之前被我們在佈局中組合出來的
// 現在我們要為rowview裡面的元件設定Text和Icon
// 最後再回傳rowview作為ListView中每一個row的顯示內容
return rowview;
}
}
public OnItemClickListener OICL = new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView parent, View view, int position, long id)
{
String where;
if(parent.equals(ListEPlayer))
where = "你選擇了東區的";
else
where = "你選擇了西區的";
setTitle(where + ((TextView)view.findViewById(R.id.position)).getText()
+ ":" + parent.getItemAtPosition(position));
// getItemAtPosition(position)在官網的敘述是這樣的
// Gets the data associated with the specified position in the list.
// 上面所說的the data就是當初我們 super(context, textViewResourceId, itemname);
// 所回傳的itemname了 , 可以參考父類別ArrayAdapter的建構子
// ArrayAdapter(Context context, int textViewResourceId, T[] objects)
}
};
}
相關文章:

















