一、寫在前面: 本次我們來講解一下Android應用中三個適配器:BaseAdapter、SimpleAdapter和ArrayAdapter。其中常見的是BaseAdapter,也是個人推薦使用的適配器。 二、深入瞭解: 1.什麼是適配器? 適配器:在安卓中,顧名思義就是把數據變成符合界面風格的形 ...
一、寫在前面:
本次我們來講解一下Android應用中三個適配器:BaseAdapter、SimpleAdapter和ArrayAdapter。其中常見的是BaseAdapter,也是個人推薦使用的適配器。
二、深入瞭解:
1.什麼是適配器?
適配器:在安卓中,顧名思義就是把數據變成符合界面風格的形式,並且通過ListView顯示出來。也就是說適配器是數據和界面之間的橋梁。
適配器在資料庫中的數據(後臺)和顯示頁面(前端)中充當一個轉換器的角色,資料庫中的數據(如數組,鏈表,資料庫,集合等)通過適配器變成類手機頁面能夠正常顯示的數據。可以看作是界面數據綁定的一種理解。假設把數據、適配器和ListView(頁面)比喻成一個MVC模式的話,那麼適配器(Adapter)在這中間就充當了Controller的角色。
2.為什麼對象設置數據源
一般是為ListView提供數據的轉換,當然GridView[網格視圖]、Spinner[下拉列表]、Gallery[畫廊]、ViewPage等都需要使用適配器來為其設置數據源。
三、代碼示例:
ArrayAdapter示範:
要求:使用數組適配器輸出相對應的數據到ListView中
1、首先、創建Android工程,後在佈局文件中定義一個ListView,並且設置好相關屬性:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
2、其次、在activity類中書寫代碼,具體請看代碼,並且代碼上有相關的註釋
package com.mqz.android_arrayadapter;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
private ListView listView; //定義ListView用來獲取到,佈局文件中的ListView控制項
private String[] city = {"廣州","深圳","北京","上海","香港","澳門","天津"} ; //定義一個數組,作為數據源
private ArrayAdapter<String> arrayAdapter; //定義一個數組適配器對象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.listView); //獲取佈局文件中的ListView控制項對象
/*
* Context context, 上下文對象
* int resource, items項顯示的佈局樣式,一般是系統的佈局文 android.R.layout.** (但是需要選擇和ListView相適合的佈局文件否則運行報錯)
* String[] objects 數組對象(數據源)
*
* */
//創建數組適配器對象,並且通過參數設置類item項的佈局樣式和數據源
arrayAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1, city);
//把數組適配器載入到ListView控制項中
listView.setAdapter(arrayAdapter);
}
}
3、運行結果:這樣不需要我們自己定義TextView控制項中的內容,通過數組適配器實現了這一個目的。
SimpleAdapter示範:
要求:把後臺數據填充到頁面,其中包括需要填充的有TextView和ImageView,也就是名字和圖片顯示到頁面上。
1、首先,創建好android工程,並且在主佈局文件中添加一個ListView控制項
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context="com.mqz.android_simpleadapter.MainActivity" >
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
></ListView>
</LinearLayout>
2、其次,在Activity類中書寫代碼,其間附有註釋,具體如下:
package com.mqz.android_simpleadapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView listView; //定義ListView對象,用來獲取佈局文件中的ListView控制項
private String[] name = {"小明","小華","小梁","小王","小林","小趙"}; //定義一個名字數組,用來為數據源提供姓名
private int[] images = {R.drawable.one,R.drawable.two,R.drawable.three,R.drawable.four,R.drawable.five,R.drawable.six};//定義一個 整形數組,用來為數據源中的頭像
private List<Map<String,Object>> list_map = new ArrayList<Map<String,Object>>(); //定義一個適配器對象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView); //獲取佈局文件中的ListView對象
//1.準備好數據源,迴圈為listView添加數據(數據源的準備工作,這裡是模擬從SQLite中查詢數據)
for(int i=0;i<6;i++){
Map<String,Object> items = new HashMap<String, Object>(); //創建一個鍵值對的Map集合,用來存放名字和頭像
items.put("pic", images[i]); //放入頭像, 根據下標獲取數組
items.put("name", name[i]); //放入名字, 根據下標獲取數組
list_map.add(items); //把這個存放好數據的Map集合放入到list中,這就完成類數據源的準備工作
}
//2、創建適配器(可以使用外部類的方式、內部類方式等均可)
SimpleAdapter simpleAdapter = new SimpleAdapter(
MainActivity.this,/*傳入一個上下文作為參數*/
list_map, /*傳入相對應的數據源,這個數據源不僅僅是數據而且還是和界面相耦合的混合體。*/
R.layout.list_items, /*設置具體某個items的佈局,需要是新的佈局,而不是ListView控制項的佈局*/
new String[]{"pic","name"}, /*傳入上面定義的鍵值對的鍵名稱,會自動根據傳入的鍵找到對應的值*/
new int[]{R.id.items_imageView1,R.id.items_textView1});/*傳入items佈局文件中需要指定傳入的控制項,這裡直接上id即可*/
//3、為listView加入適配器
listView.setAdapter(simpleAdapter);
});
}
}
詳細的解釋適配中的參數關係:
3、創建 item 項的 layout 佈局文件:
下麵是 item 項的佈局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<ImageView
android:id="@+id/items_imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/items_textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="52dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/items_textView2"
android:text="hello android!"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
4、運行結果:
BaseAdapter示範:
1、創建好安卓工程之後,新建一個包,並且子這個包中定義一個 User 實體類(用來後面的數據源使用),可以簡單定義一兩個屬性即可,這裡只是做測試而已。(模擬從資料庫中查詢數據。)
2、在 MainActivity 類中進行主要的代碼書寫:
package com.mqz.android_baseadapter_one;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.mqz.android_baseAdapter_one_entity.User;
public class MainActivity extends Activity {
private ListView listView; //定義ListView控制項,用來獲取佈局文件中的ListView
private List<User> list; //存放數據源你的集合,泛型設置為User類型。
private int[] images = {R.drawable.one,R.drawable.two,R.drawable.three,R.drawable.four,R.drawable.five,};//定義數組,保存圖片Id用用來設置頭像
private String[] names = {"張三","李四","王五","趙六","天啟"};//定義字元串數組,用來保存用戶的名字
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);//獲取ListView控制項
//1.載入數據源,在這裡只是模擬一個從資料庫中查詢數據的操作。(模擬資料庫查詢數據的操作)
list = new ArrayList<User>();
for(int i=0;i<5;i++){
User u = new User();
u.setName(names[i]); //設置名字,根據定義的數組設置
u.setPic(images[i]); //定義頭像,在實體類中需要定義為整形,因為在R文件中所有的資源文件都是整形的。
list.add(u); //添加對象到list集合中,數據源準備成功。
}
//2.創建BaseAdapter適配器,並且配置好相對應的佈局文件(本次使用內部類的方式)
//3.把適配器載入到ListView中
MyBaseAdapter adapter = new MyBaseAdapter(); //創建這個成員內部類的對象
listView.setAdapter(adapter); //為數據源設置好適配器
}
class MyBaseAdapter extends BaseAdapter{
//獲取當前items項的大小,也可以看成是數據源的大小
@Override
public int getCount() {
return list.size();
}
//根據item的下標獲取到View對象
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
//獲取到items的id
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
//根據傳入item的下標,獲取到view對象
/*
* int position, 表示item所在listView中的下標,也是在數據源中下標所對應的數據
* View convertView, 緩存機制,當一些item項滑出屏幕的時候,會創建新的View對象,這樣會使得記憶體資源占據,
* 所以使用convertView判斷是否為空,如果為空的說明item沒有滑出,需要創建新的view對象
* 如果不為空,說明已經滑出類屏幕所以使用convertView ,view = convertView,
* 可以把convert 理解為滑出的view對象
* ViewGroup parent 視圖組對象,即 表示當前繪製的items項所屬的ListView對象。
* */
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
//獲取填充器對象,這個對象可以幫助我們繪製出items項,獲取方式有多種:
//LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LayoutInflater inflater = MainActivity.this.getLayoutInflater();
/*
調用打氣筒中的 inflate(int resource, ViewGroup root) 方法
第一個參數是一個佈局文件對象,通過這個佈局文件,inflater會在這佈局文件中繪製items項
第二個參數是需不需要將第一個參數中的那個佈局文件嵌入到另外一個佈局文件中。如果要寫上佈局文件的id,如果不需要直接寫null
*/
view = inflater.inflate(R.layout.items_layout, null);
User u = list.get(position);//通過回調這個方法傳過來的position參數獲取到指定數據源中的對象
//找到佈局文件中的控制項
ImageView pic = (ImageView) view.findViewById(R.id.items_pic);
TextView name = (TextView) view.findViewById(R.id.itmes_name);
pic.setImageResource(u.getPic());//從數據源中獲取頭像 設置到佈局文件的ImageView控制項中。
name.setText(u.getName());//從數據源中獲取名字 設置到佈局文件的TextView控制項中。
return view;
}
}
}
更進一步:
4、運行結果: