android學習筆記28————–android ListView詳解

在android開發中ListView是比較常用的組件,它以列表的形式展示具體內容,並且能夠根據數據的長度自適應顯示。

 列表的顯示需要三個元素:

1.ListVeiw 用來展示列表的View。

2.適配器 用來把數據映射到ListView上的中介。

3.數據    具體的將被映射的字符串,圖片,或者基本組件。

根據列表的適配器類型,列表分為三種,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter

其中以ArrayAdapter最為簡單,隻能展示一行字。SimpleAdapter有最好的擴充性,可以自定義出各種效果。SimpleCursorAdapter可以認為是SimpleAdapter對數據庫的簡

單結合,可以方面的把數據庫的內容以列表的形式展示出來。

 我們從最簡單的ListView開始:

[java]
public class ListViewActivity extends Activity 

    private ListView listView; 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
        super.onCreate(savedInstanceState); 
        listView = new ListView(this); 
        listView.setAdapter(new ArrayAdapter<String>(this, 
                android.R.layout.simple_expandable_list_item_1, getData())); 
        setContentView(listView); 
 
    } 
 
    private List<String> getData() 
    { 
        List<String> data = new ArrayList<String>(); 
        data.add("測試數據1"); 
        data.add("測試數據2"); 
        data.add("測試數據3"); 
        data.add("測試數據4"); 
        return data; 
    } 

public class ListViewActivity extends Activity
{
 private ListView listView;

 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  listView = new ListView(this);
  listView.setAdapter(new ArrayAdapter<String>(this,
    android.R.layout.simple_expandable_list_item_1, getData()));
  setContentView(listView);

 }

 private List<String> getData()
 {
  List<String> data = new ArrayList<String>();
  data.add("測試數據1");
  data.add("測試數據2");
  data.add("測試數據3");
  data.add("測試數據4");
  return data;
 }
}

 

佈局文件可以為空

 

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

</LinearLayout>

 

上面代碼使用瞭ArrayAdapter(Context context, int textViewResourceId, List<T> objects)來裝配數據,要裝配這些數據就需要一個連接ListView視圖對象和數組數

據的適配器來兩者的適配工作,ArrayAdapter的構造需要三個參數,依次為this,佈局文件(註意這裡的佈局文件描述的是列表的每一行的佈局,

android.R.layout.simple_list_item_1是系統定義好的佈局文件隻顯示一行文字,數據源(一個List集合)。同時用setAdapter()完成適配的最後工作。運行後的現實結構

如下圖:

 

 

SimpleCursorAdapter

  sdk的解釋是這樣的:An easy adapter to map columns from a cursor to TextViews or ImageViews defined in an XML file. You can specify which

 columns you want, which views you want to display the columns, and the XML file that defines the appearance of these views。簡單的說就是方便把從

遊標得到的數據進行列表顯示,並可以把指定的列映射到對應的TextView中。

  下面的程序是從電話簿中把聯系人顯示到類表中。先在通訊錄中添加一個聯系人作為數據庫的數據。然後獲得一個指向數據庫的Cursor並且定義一個佈局文件(當然也可以

使用系統自帶的)。

[java]
private ListView listView; 
    @Override 
    public void onCreate(Bundle savedInstanceState){ 
        super.onCreate(savedInstanceState); 
         
        listView = new ListView(this); 
         
        Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
        startManagingCursor(cursor); 
         
        ListAdapter listAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_expandable_list_item_1,  
                cursor, 
                new String[]{ContactsContract.Contacts.DISPLAY_NAME},  
                new int[]{android.R.id.text1}); 
         
        listView.setAdapter(listAdapter); 
        setContentView(listView); 
    }
 

SimpleAdapter

simpleAdapter的擴展性最好,可以定義各種各樣的佈局出來,可以放上ImageView(圖片),還可以放上Button(按鈕),CheckBox(復選框)等等。下面的代碼都直接繼承

瞭ListActivity,ListActivity和普通的Activity沒有太大的差別,不同就是對顯示ListView做瞭許多優化,方面顯示而已。

下面的程序是實現一個帶有圖片的類表。

首先需要定義好一個用來顯示每一個列內容的xml

[java]
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
 
<RelativeLayout  
        android:orientation="vertical" 
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"> 
          
         <ImageView  
            android:id="@+id/img"          
            android:layout_width="wrap_content"        
            android:layout_height="wrap_content"          
            android:layout_margin="2px"/> 
             
        <TextView  
            android:id="@+id/title"  
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"  
            android:layout_toRightOf="@id/img" 
            android:textColor="#FFFFFFFF" 
            android:textSize="20px" /> 
             
        <TextView  
            android:id="@+id/info"  
            android:layout_toRightOf="@id/img" 
            android:layout_below="@id/title" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"  
            android:textColor="#FFFFFFFF" 
            android:textSize="13px" />                    
             
    </RelativeLayout>  
 
</LinearLayout> 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_width="fill_parent"
 android:layout_height="fill_parent">

<RelativeLayout
  android:orientation="vertical"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
  
   <ImageView
    android:id="@+id/img"        
    android:layout_width="wrap_content"      
    android:layout_height="wrap_content"        
    android:layout_margin="2px"/>
    
  <TextView
   android:id="@+id/title"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_toRightOf="@id/img"
   android:textColor="#FFFFFFFF"
   android:textSize="20px" />
   
  <TextView
   android:id="@+id/info"
   android:layout_toRightOf="@id/img"
   android:layout_below="@id/title"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:textColor="#FFFFFFFF"
   android:textSize="13px" />     
   
 </RelativeLayout> 

</LinearLayout>

下面是實現代碼:

[java]
public class ListViewActivity extends ListActivity 

 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
        super.onCreate(savedInstanceState); 
        SimpleAdapter adapter = new SimpleAdapter(this, getData(), 
                R.layout.main, new String[] 
                { "title", "info", "img" }, new int[] 
                { R.id.title, R.id.info, R.id.img }); 
        setListAdapter(adapter); 
 
    } 
 
    private List<Map<String, Object>> getData() 
    { 
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); 
 
        Map<String, Object> map = new HashMap<String, Object>(); 
        map.put("title", "name1"); 
        map.put("info", "info 1"); 
        map.put("img", R.drawable.icon); 
        list.add(map); 
 
        map = new HashMap<String, Object>(); 
        map.put("title", "name2"); 
        map.put("info", "info 2"); 
        map.put("img", R.drawable.icon); 
        list.add(map); 
 
        map = new HashMap<String, Object>(); 
        map.put("title", "name3"); 
        map.put("info", "info 3"); 
        map.put("img", R.drawable.icon); 
        list.add(map); 
 
        return list; 
    } 
 

public class ListViewActivity extends ListActivity
{

 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  SimpleAdapter adapter = new SimpleAdapter(this, getData(),
    R.layout.main, new String[]
    { "title", "info", "img" }, new int[]
    { R.id.title, R.id.info, R.id.img });
  setListAdapter(adapter);

 }

 private List<Map<String, Object>> getData()
 {
  List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

  Map<String, Object> map = new HashMap<String, Object>();
  map.put("title", "name1");
  map.put("info", "info 1");
  map.put("img", R.drawable.icon);
  list.add(map);

  map = new HashMap<String, Object>();
  map.put("title", "name2");
  map.put("info", "info 2");
  map.put("img", R.drawable.icon);
  list.add(map);

  map = new HashMap<String, Object>();
  map.put("title", "name3");
  map.put("info", "info 3");
  map.put("img", R.drawable.icon);
  list.add(map);

  return list;
 }

}

使用simpleAdapter的數據用一般都是HashMap構成的List,list的每一節對應ListView的每一行。HashMap的每個鍵值數據映射到佈局文件中對應id的組件上。因為系統沒有

對應的佈局文件可用,我們可以自己定義一個佈局vlist.xml。下面做適配,new一個SimpleAdapter參數一次是:this,佈局文件(main.xml),HashMap的 title 和

 info,img。佈局文件的組件id,title,info,img。佈局文件的各組件分別映射到HashMap的各元素上,完成適配。

運行效果如下圖

 

摘自 奔跑的蝸牛

發佈留言