AdapterView的內容通常是包含多項相同格式資源的列表,經常使用的有5種AdapterView的子類:html
(1)ListView:簡單的列表
(2)Spinner:下拉列表,給用戶提供選擇
(3)Gallery:縮略圖,已經被水平的ScrollView和ViewPicker取代,但也還算經常使用,是一個能夠把子項以中心鎖定,水平滾動的列表
(4)GridView:網格圖,以表格形式顯示資源,能夠左右滑動的
java
這裏先介紹最簡單的顯示列表視圖ListView。android
列表的顯示須要三個元素:
1.ListVeiw (或另外三個):用來展現列表的View。
2.Adapter適配器 :用來把數據映射到ListView上的中介,列表項的數據由Adapter提供
3.數據 :具體的將被映射的字符串,圖片,或者基本組件。
根據列表的適配器類型,列表分爲4種:
web
(1)ArrayAdapter:它只能處理列表項內容全是文本的狀況。數據庫
◆數據源:數組或者List<String>對象或者其餘數組
(2)SimpleAdapter: 它不只能夠處理列表項全是文本的狀況,當列表項中還有其餘控件時,一樣能夠處理,每一個列表項能夠定製更復雜的佈局,組件等app
◆數據源:只能爲List<Map<「鍵」,「值」>>形式的數據less
(3)自定義Adapter:繼承BaseAdapter,ide
根據xml文件中定義的樣式驚醒列表項的填充,適用性最強。函數
(4)SimpleCursorAdapter:專門用於把遊標Cursor(數據庫查詢集)中的數據映像到列表中(咱們之後再來研究),用在SQLite數據庫較多
LisView組件經常使用的Xml屬性:
android:divider:設置List列表項的分隔條,便可用顏色區分,也可用Drawable對象分隔
android:dividerHeight:設置分隔條高度
android:entries:指定一個數組資源,Android將根據該數據資源來生成ListView
一,使用android:entries屬性爲LisView指定數組
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ListView android:id="@+id/listView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:divider="#f00" android:dividerHeight="2dp" android:entries="@array/books" android:headerDividersEnabled="false" > </ListView></LinearLayout>
arrays.xml
<?xml version="1.0" encoding="utf-8"?><resources> <string-array name="books"> <item>北京</item> <item>上海</item> <item>廣州</item> <item>深圳</item> </string-array> </resources>
上面一個ListView指定一個 android:entries="@array/books",使用了下面的數組資源
使用數組建立LisView十分簡單,但這種LisView能定製的內容不多,甚至連每一個列表項的字號,顏色都不能改變
二,使用ArrayAdapter建立LisView
其中以ArrayAdapter最爲簡單, 只能展現一行字
ArrayAdapter的三個參數
* Context:表明訪問整個Android應用的接口。幾乎建立全部的組件都須要傳入Context對象
* textViewResourcedId:一個資源Id,該Id表明一個TextView,該TextView組件將做爲AarryAdapter的列表組件, 這裏的佈局文件是指每一個列表項的佈局文件,能夠本身定製,也可使用android提供的佈局文件
*
數組或List
:負責爲多個列表框提供數據
main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"><pre name="code" class="html"> <!--使用紅色分隔條-->
<ListView android:id="@+id/listView1" android:layout_width="fill_parent" android:layout_height="335dp" android:divider="#f00" android:dividerHeight="2dp" android:headerDividersEnabled="false" > </ListView> <!--使用綠色分隔條--> <ListView android:id="@+id/listView2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:divider="#0f0" android:dividerHeight="2dp" android:headerDividersEnabled="false" > </ListView></LinearLayout>
array_item.xml 能夠定製TextView的字體顏色了
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:shadowColor="#f0f" android:shadowDx="4" android:shadowDy="4" android:shadowRadius="2" android:textSize="20dp" />
checked_item.xml
<?xml version="1.0" encoding="utf-8"?><CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/TextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20dp" android:checkMark="@drawable/ok" android:shadowColor="#f0f" android:shadowDx="4" android:shadowDy="4" android:shadowRadius="2"/>
MainActivity.java
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView list1=(ListView) findViewById(R.id.listView1); ListView list2=(ListView) findViewById(R.id.listView2); String[] str1={"唐僧","孫悟空","豬八戒","沙和尚"}; //用數組包裝ArrayAdapter /*ArrayAdapter的三個參數 * Context:表明訪問整個Android應用的接口。幾乎建立全部的組件都須要傳入Context對象 * textViewResourcedId:一個資源Id,該Id表明一個TextView,該TextView組件將做爲AarryAdapter的列表組件 * * 數組或List:負責爲多個列表框提供數據*/ ArrayAdapter<String> ad1=new ArrayAdapter<String>(this,R.layout.array_item,str1); //爲ListView設置adapter list1.setAdapter(ad1); String[] str2={"湖北省","湖南省","江蘇省","浙江省"}; //用數組包裝ArrayAdapter ArrayAdapter<String> ad2=new ArrayAdapter<String>(this,R.layout.checked_item,str2); //爲ListView設置adapter list2.setAdapter(ad2); }
ArrayAdapter(Context context, int textViewResourceId, List<T> objects)來裝配數據,要裝配這些數據就須要一個鏈接ListView視圖對象和數組數據的適配器來二者的適配工做,同時用setAdapter()完成適配的最後工做
三,使用SimpleAdapter建立ListView
simpleAdapter的擴展性最好, 每一個列表項能夠定義各類各樣的佈局出來,能夠放上ImageView(圖片),還能夠放上Button(按鈕),CheckBox(複選框) 等等。
simpleAdapter的 數據源:只能爲List<Map<「鍵」,「值」>>形式的數據
SimpleAdapter對象,須要5個參數,後面4個是關鍵
* 第2個參數: 是一個List<Map<? extends Map<string,?>>的集合對象 ,集合中的每一個 Map<string,?>對象是一個列表項
* 第3個參數:該參數指定一個列表項佈局界面的ID。
* 第4個參數: 一個String[]類型的參數,決定提取Map對象中的那些key值對應的value類生成類表項 就是: 須要顯示value的key值
* 第5個參數: int[]類型的參數,決定填充哪些 組件, 就是使用顯示值得組件Id
* 注意:第4,5個參數的數組須要一一對應才行
使用SimpleAdapter提供列表項
main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <!-- 定義一個ListView --> <ListView android:id="@+id/listView1" android:layout_width="fill_parent" android:layout_height="255dp" > </ListView> <TextView android:id="@+id/textView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.00" android:textColor="#f0f" android:textSize="20dp" /> <TextView android:id="@+id/textView2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.00" android:textColor="#f00" android:textSize="20dp" /></LinearLayout>
simple_item.xml,這是每一個列表項的佈局文件,左顯示一張圖片,右邊是上下分佈的兩個文本框描述,這樣就更加複雜了ListView的列表項
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" ><!--定義一個ImageView,,做爲列表項的一部分,id與java代碼中相同--> <ImageView android:id="@+id/header" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/tiger" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="vertical" ><pre name="code" class="java"><!--定義一個TextView,,做爲列表項的一部分-->
<TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="10dp" android:textColor="#f0f" android:textSize="18dp" />
<!--定義一個TextView,,做爲列表項的一部分-->
<TextView android:id="@+id/desc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="10dp" android:textSize="14dp" /> </LinearLayout></LinearLayout>
MainActivity.java
public class MainActivity extends Activity { private String[] names=new String[]{ "虎頭","弄玉","李清照","李白" }; private String[] descs=new String[]{ "可愛的老虎","一個擅長音樂的女孩","一個擅長文學的女性","浪漫主義詩人" }; private int[] imagesIds=new int[]{ R.drawable.tiger,R.drawable.nongyu,R.drawable.qingzhao,R.drawable.libai }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView show=(TextView) findViewById(R.id.textView1); final TextView show2=(TextView) findViewById(R.id.textView2); //建立一個List集合。List集合的元素是Map List<Map<String,Object>> listItems=new ArrayList<Map<String,Object>>(); //第一步:建立List集合 //for循環,爲list賦值 for(int i=0;i<names.length;i++){ Map<String,Object> item=new HashMap<String,Object>(); item.put("header", imagesIds[i]); item.put("personName", names[i]); item.put("desc", descs[i]); //把列表項放入到list中 listItems.add(item); } //第二步:設置SimpleAdapter的參數 /*SimpleAdapter對象,須要5個參數,後面4個是關鍵 * 第2個參數:是一個List<Map<? extends Map<string,?>>的集合對象,集合中的每一個 Map<string,?>對象是一個列表項 * 第3個參數:該參數指定一個列表項佈局界面的ID * 第4個參數:一個String[]類型的參數,決定提取Map對象中的那些key值對應的value類生成類表項 * 就是:須要顯示值 * 第5個參數:int[]類型的參數,決定填充哪些 組件,就是使用顯示值得組件Id * 注意:第4,5個參數的數組須要一一對應才行 */ SimpleAdapter sd=new SimpleAdapter(this,listItems,R.layout.simple_item,new String[]{"personName","header","desc"},new int[]{R.id.name,R.id.header,R.id.desc}); //爲ListView設置Adapter ListView list=(ListView) findViewById(R.id.listView1); list.setAdapter(sd);//第三步,添加adapter //爲列表項設置單擊事件 list.setOnItemClickListener(new OnItemClickListener(){ //第position項被單擊時觸發該方法 @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub show.setText(names[position]+"是"+descs[position]); } }); }
當須要監聽用戶單擊,選中某個列表項時間,能夠經過adapterview的
setOnItemClickListener方法
//爲列表項設置單擊事件 listview.setOnItemClickListener(new OnItemClickListener(){ //第position項被單擊時觸發該方法 @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub //添加操做 } });
使用SimpleAdapter分三步:
1,建立List<Map<String,Object>>集合
2,設置SimpleAdapter參數
3,爲ListView添加simpleadpater
四,擴展BaseAdapter建立ListView
擴展BaseAdapter:
(1)建立類,繼承自BaseAdapter
(2)重寫其中的四個方法
①int getCount():返回的是數據源對象的個數,即列表項數
②Object getItem(int position):返回指定位置position上的列表
③long getItemId(int position):返回指定位置處的行ID
④View getView():返回列表項對應的視圖,方法體中
◆實例化視圖填充器
◆用視圖填充器,根據Xml文件,實例化視圖
◆根據佈局找到控件,並設置屬性
◆返回View視圖
main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView></LinearLayout>
MainActivity.java
package com.hust.baseadaptertest;import android.app.Activity;import android.graphics.Color;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity { ListView mylistview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mylistview=(ListView)findViewById(R.id.listView1); //自定義baseadapter:程序要建立多少個列表項,每一個列表項的組件都有開發者來決定 BaseAdapter ba=new BaseAdapter(){ //自動重寫這4個函數 @Override public int getCount() { // TODO Auto-generated method stub return 20;//指定一共包含20個選項 } //返回值決定第position處的列表項內容 @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } //重寫該方法,該方法的返回值將做爲列表項的ID @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } //重寫該方法,該方法返回的View將做爲列表框,決定第position處的列表項組件對象 /* * Get a View that displays the data at the specified position in the data set. * You can either create a View manually or inflate it from an XML layout file. * When the View is inflated, the parent View (GridView, ListView...) will apply default layout parameters * unless you use android.view.LayoutInflater.inflate(int, android.view.ViewGroup, boolean) * to specify a root view and to prevent attachment to the root. */ @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub /* * 手動建立列表項的佈局文件 * */ //建立以個LinearLayout,並向其中添加兩個組件 LinearLayout line=new LinearLayout(MainActivity.this); line.setOrientation(0); //一個ImageView組件 ImageView image=new ImageView(MainActivity.this); image.setImageResource(R.drawable.ic_launcher); //一個TextView組件 TextView text=new TextView(MainActivity.this); text.setText("第"+(position+1)+"個列表項"); text.setTextSize(20); text.setTextColor(Color.RED); //兩個組件添加到佈局組件中 line.addView(image); line.addView(text); //返回佈局組件 return line; } }; //設置adapter mylistview.setAdapter(ba); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
總結一下:
1:聲明AdapterView對象子類(ListView,Spinner,Gallary,GridView),根據ID利用findViewById方法找到此對象2:聲明Adapter對象,根據構造方法實例化此對象。具體以下:(1)ArrayAdapter<數據類型> adapter = new ArrayAdapter<數據類型>(context:通常指當前Activity對象,layout:每一個列表項顯示的佈局,data:數據源變量);(2)SimpleAdapter adapter = new SimpleAdapter(context:通常指當前Activity對象,data:數據源變量,layout:每一個列表項顯示的佈局,new String[]{}:數據源中的「鍵」,new int[]{}:顯示數據源的控件ID);(3)自定義Adapter類 adapter = new 自定義Adapter類構造方法;3:綁定Adapter對象到Adapter上AdapterView對象.setAdapter(Adapter對象);