總網頁瀏覽量

2013年3月23日 星期六

ListView

Adapter:
連接後端資料與前端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;
}
}






沒有留言:

張貼留言