連接後端資料與前端View的配接器
SimpleAdapter:可以自由擴充listItem格式
ArrayAdapter:listitem只能顯示一行
ListView讓手機頁面秀出垂直條列式項目。
約有三種方式:
一、
1.
首先在xml貼上<ListView>標籤,
<ListView
android:id="@+id/lv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
></ListView>
預覽頁面會是下面這樣:
2.定義Item長相:
Item也是layout一種,一般新增一個xml來做Item版面配置。
假如我們希望Item長相如下:
有Icon,有title以及說明內容。
那麼新增一個item.xml,用來描繪Item的長相
上圖用兩個LinearLayout以及一個ImageView以及兩個TextView實作。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<ImageView
android:id="@+id/item_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/TVClose" //圖片所屬資料夾以及檔名
/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="4"
android:orientation="vertical"
>
<TextView
android:id="@+id/item_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="TVclose"
android:textSize="24dip"
android:textStyle="bold"
/>
<TextView
android:id="@+id/item_content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="電視收播圖像"
android:textSize="12dip"
/>
</LinearLayout>
</LinearLayout>
在drawable放圖片檔案:
另外要在res資料夾裏頭,新增資料夾drawable,裡面放想要呈現在listview的圖片,放在res的檔案android會自動配置參考地址(int 型態)。在java要取用時可以打R.drawable.圖片檔名。
在.java宣告
private ListView lv;
lv=(ListView)findViewbyId(R.id.lv)
常見作法用ArrayList以及HashMap配合和泛型實作ListView
ArrayList表示ListView容器本身,HashMap表示一個Item。
ArrayList可以裝多個HashMap。
HashMap可以裝Item的資訊、圖檔
ArrayList<HashMap<String,Object>> list = new ArrayList<HashMap<String,Object>>();
//宣告ArrayList,這個ArrayList可以裝下多個HashMap
//以HashMap實作ListView的Item
//String:是key、index,也可以屬性來比喻他,方便開發者更好寫程式。Object是資料,可以用值來比喻。
HashMap<String,Object> data1 = new HashMap<String,Object>();
data1.put("item_img",R.drawable.freezer );//存放圖檔
data1.put("item_title", "Freezer");//Item圖檔在listview的名字
data1.put("item_content", "佛利沙,過去在宇宙為人人聞之色變的惡魔");
//Item說明
list.add(data1);//將Item塞入listview(將HashMap塞入Arraylist物件)
HashMap<String,Object> data4 = new HashMap<String,Object>();
data4.put("item_img", R.drawable.tvclose);
data4.put("item_title", "TVclose");
data4.put("item_content", "電視收播,以前電視台休息收播會出現影像");
list.add(data4);
//上面已經宣告listview設定,尚未告訴android
//main_activity.java的item與item.xml怎樣連接
//也沒告訴.java的listview與xml的listview連接
//底下實作之
String[] from = {"item_img","item_title","item_content"};
//HashMap的key,為了底下SimpleAdapter使用
int[] to = {R.id.item_img,R.id.item_title,R.id.item_content};
//Item.xml的標籤id
//注意int陣列中元素所代表的物件要正確對應到String的每個字串所代表的物件,例如R.id.item_title在item.xml代表TextView物件,而String[] from的"item_title"在activity.java裡面代表HashMap的字串,所以順序擺放要
正確,否則無法正確顯示listview
如果將順序改成如下,那麼顯示的listView如圖:
//int[] to = {R.id.item_content,R.id.item_title,R.id.item_img};
SimpleAdapter adapter = new SimpleAdapter(this, list,R.layout.item, from, to);
//資料與lItem的配接器,參數缺一不可,android才會幫我們接上對應的
//SimpleAdapter(哪個.java的item(context),哪個xml的item,HashMap的key,Item.xml版面配置單一選項編號)
lv.setAdapter(adapter);
//設置listview的配接器,item要秀在哪個listview
二、
1.
xml放一個<ListView />
<ListView
android:id="@android:id/list"
@android:id/list意思是調用android系統內建的id(資源)
//而且list只能給ListView用,如果用android:id其他的項目則會發生錯誤
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:drawSelectorOnTop="false"
/>
2.
extends ListActivity
3.
制定listview內容
String[] items = {"Aibo","Brad","Clock","David","Enjoy"};
setListAdapter(new ArrayAdapter(this,android.R.layout.XXXX,items));
//ArrayAdapter(context,listview格式,listview(裡面的textView)內容)
//setListAdapter
String[] items ={"Sherry", "Dorara", "Black", "Int", "Five"};
Button button1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//list項目
//setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items));
//ArrayAdapter(context , 格式TextViewResourceId(android有內建xml檔案?各式各樣格式, ,項目內容String[] items);
//普通格式
//setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_single_choice,items));
//radiocheck模式
//setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_checked,items));
//打勾圖示
setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_activated_1,items));
//項目反白
//getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
//getListView()從Activity取得ListView物件
//複選模式
//如果不打上這行,預設為Choice_mode_none
//選擇項目
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
//單選模式
button1=(Button)findViewById(R.id.button1);
}
//callback method
public void onListItemClick(ListView parent,View v, int position, long id){
button1.setText(items[position]);
}
三、整個activity視為ListView
1.準備一個XML描述ListView單一項目
<!-- <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
/> -->
//若加上這個,每一項目都有button
//setOnItemClickListener失效
<TextView
android:id="@+id/item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:layout_marginBottom="6dp"
android:textSize="24sp"
android:textStyle="bold|italic"
/>
2.新增一個Activity extends ListActivity
3.
宣告陣列存放ListView的項目內容
//例如Listview每一項目有TextView則宣告字串陣列
String[] item = {"one","two","three"};
//如果ListView項目有圖片就宣告 int陣列
int[] photos={R.drawable.photo1,R..drawable.photo2,R.drawable.photo3};
4.
宣告ArrayList為ListView容器
HashMap代表ListView的每一筆紀錄
一筆紀錄有多個屬性(欄位)
(一筆紀錄有textview以及image)
ArrayList<HashMap<String,String>> data = new ArrayList();
5.
String[] from = {"item_title"};
//item的key名稱,
//目的讓adapter做配接用
int[] to ={R.id.item_title};
//對應到描述listview單一項目的Xml檔案,裡面的元件(wedgit)的ID。
//對應textview的id
//如果xml有TextView以及ImageView元件,元件id分別是R.id.item_title,R.id.pictur
//則宣告int[] to = {R.id.item_title,R.id.picture}
6.將內容塞入HashMap
for(String item:items){
HashMap<String,String> dd = new HashMap();
dd.put(from[0], item);
//將每一筆紀錄第from[0]欄位存放資料內容
data.add(dd);
}
7.將資料與ListView配接
adapter = new SimpleAdapter(this,data,R.layout.activity_main,from,to);
//this 的 data 放在 R.layout.activity_main,hashmap的key(就是from)要與xml的欄位(即to)對應
8.View物件使用配接器
lv=getListView();
//將整個Activity視為listview
//原本lv= (ListView)findViewById(R.id.lv);
lv.setAdapter(adapter);
private ListView lv;
private SimpleAdapter adapter;
private String[] items = {
"LinearLayout", "RelativeLayout",
"TableLayout", "ListView",
"Gallery"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
String[] from = {"item_title"};
//item的key
int[] to ={R.id.item_title};
//對應到listItem每項目裡面的元件。 對應textview的id
ArrayList<HashMap<String,String>> data = new ArrayList();
for(String item:items){
HashMap<String,String> dd = new HashMap();
dd.put(from[0], item);
data.add(dd);
}
adapter = new SimpleAdapter(this,data,R.layout.activity_main,from,to);
lv=getListView();
//將整個Activity視為listview
//原本lv= (ListView)findViewById(R.id.lv);
lv.setAdapter(adapter);
// lv.setOnClickListener(new OnClickListener(){
//
// @Override
// public void onClick(View v) {
// // TODO Auto-generated method stub
//
// }});
lv.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int index,
long arg3) {
doJob(index);
}});
}
private void doJob(int index )
{ switch(index)
{
case 0:
Toast.makeText(this, "LinearLayout", Toast.LENGTH_SHORT).show();
break;
case 1:
Toast.makeText(this, "RelativeLayout", Toast.LENGTH_SHORT).show();
break;
}
}
沒有留言:
張貼留言