2011年8月18日 星期四

Android學習_SimpleAdapter的使用

有很多時候,我們只需要顯示一類資料,或是說只是單純的顯示一個Array(例如:縣市名稱),那我們可以用前篇的ArrayAdapte很快速的達成,但是有更多的時候我們的資料可能是一張表(一筆資料裡面有多個欄位),那這個時候ArrayAdapte可能就會使不上力,我們需要的是另一個繼承於BaseAdapter的SimpleAdapter。

去觀察他所需要傳入的變數,可以發現有一個很奇妙的型別"List<?extends Map<String,?>>"。

所以在使用之前,我們要先將資料建立成該型態,才能正確地顯示出來。
由上圖的說明,可以瞭解傳入的參數必須是一個list<>內帶著Map<String,?>,首先看看Map這一個介面(官方說明)

Map<k,v>前面的k代表者key,後面的v代表著value,而Map附帶著put的方法,可供我們將資料塞入;所以如果以一張表來想,一個Map就代表著一筆資料、每put一次就代表增加一個欄位,接著我們再將資料add進List。
程式碼如下:

List<Map<String,String>> value=new ArrayList<Map<String,String>>();
for(int i = 0;i < result.length(); i++)
{
Map<String,String> item1=new HashMap<String,String>();
item1.put("ThingTitle",ThingTitle);
item1.put("ThingContent",ThingContent);
item1.put("LinkID",LinkID);
item1.put("RTime",RTime);
value.add(item1);
}

內容為建立了一個List叫做value,一個Map叫做item1;將我們所獲得的資料一欄一欄的藉由put方法加進item1內,並用add方法將一整份Map加入value這個List內,來完成資料的轉換。

有了資料來源以後,就可以正式開始資料放入的動作。
步驟:
1. 取得List<?extends Map<String,?>>型態的資料來源(如上面步驟)

2. 建立一個自定義的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"
>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<CheckedTextView android:id="@+id/listTextView1"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="2px"
android:layout_height="2px"
android:textColor="@drawable/green"
android:visibility="invisible"
>
</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:textSize="50px"
>
</CheckedTextView>
<CheckedTextView android:id="@+id/listTextView3"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/gray"
android:textSize="30px"
>
</CheckedTextView>

<CheckedTextView android:id="@+id/listTextView4"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/gray"
android:layout_marginRight="10px"
android:textSize="20px"
>
</CheckedTextView>

</LinearLayout>
</LinearLayout>

3. 確定resource、from與to參數

再看一次需要的參數,還有第三、四、五個不太清楚:
第三個(resource):自定義的layout id
第四個(from):依照key值,指定由第二個參數來的顯示順序
第五個(to):指定from內的各項目要放置到的R.id(EX:R.id.listTextView1)

String[] ContentItem = new String[] { "LinkID","ThingTitle", "ThingContent","RTime" };
int[] TextViewID = new int[] { R.id.listTextView1,R.id.listTextView2,R.id.listTextView3,R.id.listTextView4};
SimpleAdapter simpleAdapter = new SimpleAdapter(this,value,R.layout.object_list,ContentItem,TextViewID);
Olalist.setAdapter(simpleAdapter);

執行結果:


所以不管我們用任何方法取得到的表格資料,都可以藉由上面的順序,顯示成我們想要的列表方式。

14 則留言:

匿名 提到...

不好意思,想請問一下您的listTextView3這一欄位也就是LinkID這一個,好像沒有作用??因為顯示的都是ThingTitle、ThingTitle、RTime這三個會有顯示出資料!!不知道是不是我會錯意???

ola的家 提到...

顯示LinkID的是listTextView1,你可以觀察xml檔,在listTextView1設定了 android:visibility="invisible",所以不會顯示是正常的。

通常列表上的每一個資料都會有一個專屬的ID,那我們要怎麼取得這個ID?
1. 得知使用者按下哪一項以後,再去跟SQLite或是array比對。
2. 直接將ID加到列表上,但是將其隱藏,使用者點擊後直接取該物件的值。(也就是這篇的做法)

匿名 提到...

請問一下,我如何找出我選到的選項位置?

匿名 提到...

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();
}



});

ola的家 提到...

:D

匿名 提到...

請問一下,如果在listview裡面塞入radiobutton或button ,setOnItemClickListener都會失效耶,但是沒有radiobutton或button都可以執行,不知道為什麼?

ola的家 提到...

如果要加上按鈕,請參考:http://wangshifuola.blogspot.tw/2012/03/androidlistviewbutton.html?showComment=1359436697252#c4479127136768673897

匿名 提到...

謝謝你,我解決了。

ola的家 提到...

:D

匿名 提到...

:DD

温智皓 提到...

不好意思~問一下
那使用setOnItemClickListener來取得點選的文字內容
如果只想取得單一個欄位的內容,如只想取得ThingTitle這個欄位的資料要如何使用???

ola的家 提到...

點擊到列表後可以取得點到的編號,再利用編號去value這個陣列裡面取得你要的那一個欄位即可。

温智皓 提到...

成功了~謝謝~~~~~!!

匿名 提到...

不好意思,請問一下我自訂xml檔的時候是在專案按右鍵->New->others->android->Android XML File,且自訂一個名稱叫abc的xml檔,在SimpleAdapter simpleAdapter = new SimpleAdapter(this,value,R.layout.abc,ContentItem,TextViewID);這一行的abc底下出現紅線,但是當我改成android定義好的內建list模式(simple_list_item_2)就沒問題了,但是我想自訂一個樣式,所以想請問一下造成這個現象的原因是不是我自訂.xml的方式錯誤?還是其他的原因呢?

張貼留言