2011年8月18日 星期四

Android學習_ArrayAdapter的使用

經過剛剛聽到的對話,我決定關閉我的VS2010開啟Eclipse來記錄一下那些深怕忘記的內容。

在許多mobile程式中,常常會看到排列整齊的選單,有可能是接收RSS或WebService之後的列表,或是提供使用者選擇所需項目,而這類方便的介面許多時候更是貫串整個APP的重要功臣,例如我們常常會打開的設定列表等等。

在Android當中,要做出列表般的效果,都會藉由android.widget.Adapter的相關子類別來實現,而在很多的應用當中,其中有一種"單純只想把一類項目列出來",這時可以利用ArrayAdapter達成。

整個事情要完成只有3個步驟:
1. 在layout裡面放一個ListView。

<ListView android:id="@+id/listview1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>

2. 將ListView實體化

ListView Olalist = (ListView) this.findViewById(R.id.listview1);

3. 於要放置列表的事件中執行setAdapter。

String[] item = new String[] {"Ola的家", "魔獸世界","星海爭霸2","凱蘭迪亞傳奇","Ola Query簡介","蟲族秒滅心法","Ola MapGuide教學","Ola jQuery教學","Ola Android教學"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,item);
Olalist.setAdapter(adapter);

上方程式碼有兩個重點:
A. ArrayAdapte所接收之項目為Array,之所以前面說「"單純只想把一類項目列出來"」的原因也在這裡,ArrayAdapte的方法裡面並沒有提供多欄位的顯示方式。
B. 在第二個參數中使用"android.R.layout.simple_expandable_list_item_1",表示是用Android內建的配置。
執行結果:


單一項目是屬於ArrayAdapte的限制,但去看ArrayAdapter的說明,可以發現他也可以使用我們自己定義的配置檔;若是使用自己的配置檔(layout),那麼就必須去指定要擺放文字的textViewResourceId。
自訂的Layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<ImageView
android:id="@+id/ImageView_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10px"
android:src="@drawable/main_new"
/>

<CheckedTextView android:id="@+id/listTextView1"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/green"
>
</CheckedTextView>
<CheckedTextView android:id="@+id/listTextView2"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/green"
android:text="-----自訂"
>
</CheckedTextView>
</LinearLayout>

也就是前面擺放一張固定的圖,在顯示的內容後面加上"-----自訂"文字。
綁定的程式碼:

String[] item = new String[] {"Ola的家", "魔獸世界","星海爭霸2","凱蘭迪亞傳奇","Ola Query簡介","蟲族秒滅心法","Ola MapGuide教學","Ola jQuery教學","Ola Android教學"};
ArrayAdapter adapter = new ArrayAdapter(this, R.layout.sample_list,R.id.listTextView1,item);
Olalist.setAdapter(adapter);

執行結果:

如果看到上面的內容,想到的事情應該是:
A. 圖片可以依照項目不同嗎?
B. 第二個文字可以也直接用帶入的嗎?

答案是當然可以,但是使用ArrayAdapter可能不是最佳選擇,因為他一次綁定的數據為一個Array,對於其他內容的顯示可能就不是這麼方便,可是一切都還是可以藉由改寫的方式完成。

10 則留言:

匿名 提到...

您好,我在第二個範例不知道為何,都會無法跑成功起來,無法達到你第二個圖的圖片和自訂文字,請問是哪邊的問題呢?

ola的家 提到...

必須要有錯誤訊息才可能判斷問題所在,光靠你目前的描述我沒辦法猜測問題在哪裡。

匿名 提到...

您好,真的非常不好意思,因為我是個新手,所以問題都很奇怪。

你上面所指的自訂的Layout是指自己再開一個新的xml檔嗎??因為我是用原本系統給的activity_main.xml根據您給的自訂的Layout去修改,不過圖片和文字顏色改成自己的!!

在 自訂的Layoutlist中有分為listTextView1、listTextView2兩種。這邊不是都在用ListView,我也不清楚怎麼在這邊的xml變成包起來了。

另外是最後一個的java程式碼,和您上述的setAdapter那三行程式碼幾乎都是一樣,只差別在第二行所給的參數不一樣而已,不過我不曉得為何有四個參數,第二和第三個參數不知道是什麼意思。

實在不好意思,問題繁瑣,很抱歉。

ola的家 提到...

1. 自訂layout:即開一個新的xml檔案,並輸入自己想要的樣式,如文章中的xml檔案。

2. 概念上就是listview按照你自訂的xml檔案來顯示每一列的資料,在文章中有一個ImageView_icon的ImageView與兩個CheckedTextView,所以當程式在繪listview每一個列的時候,都會繪製這三個物件,當你有五列,就共有15個。

3. 第二參數表示使用哪一個xml來繪製(這篇就是用自訂的xml),第三個參數是該自訂的xml中要改變的物件(這篇是使用listTextView1),最後一個是要塞進去的數值(因為listview是要顯示多筆資料,所以用array的方式傳入)

匿名 提到...

多謝您不厭其煩地解釋!!!根據您的解釋,我剛剛總算解決了!!!真的是非常感激!!!

匿名 提到...

請問如何得知 按下那一各選項ㄋ??THANKS

ola的家 提到...

lv.setOnItemClickListener(new ListView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "POSITION "+arg2, Toast.LENGTH_LONG).show();
}
});

匿名 提到...

請問用這個方法
String[] item = new String[] {
};
改成
int[] image = new int[] {
};
有辦法將每個圖片也像字串一樣可以自訂嗎?

ola的家 提到...

理論上都是可以的。 :D

湯姆熊 提到...

哈哈!凱蘭迪亞傳奇!好親切的感覺啊!六年級前段班才知道吧!

張貼留言