Android高級控件--AdapterView與Adapter


  在J2EE中提供過一種非常好的框架--MVC框架,實現原理:數據模型M(Model)存放數據,利用控制器C(Controller)將數據顯示在視圖V(View)上。在Android中有這樣一種高級控件,他的實現過程就類似於MVC框架。之所以稱它高級,是因為他的使用不像其他控件一樣,拖拽到界面上就能用,而是需要通過適配器將某些樣式的數據或控件添加到其上而使用,這樣的控件就是我們今天要說的AdapterView。

一:AdapterView-->V(視圖)

  1:作用

  以列表的形式顯示數據

  2: 內容

  AdapterView的內容一般是包含多項相同格式資源的列表

  3:特點

 (1)將前端顯示和后端數據分離

 (2)內容不能通過ListView.add的形式添加列表項,需指定一個Adapter對象,通過它獲得顯示數據

 (3)ListView相當於MVC框架中的V(視圖)

   (4)Adapter相當於MVC框架中的C(控制器)

 (5)數據源相當於MVC框架中的M(模型)

   (6)超出屏幕顯示之后,自動加上滾動條

  4:分類

 (1)ListView:列表,其中只能含有一個控件TextView,

 (2)Spinner:下拉列表,給用戶提供選擇

 (3)Gallery:縮略圖,已經被水平的ScrollView和ViewPicker取代,但也還算常用,是一個可以把子項以中心鎖定,水平滾動的列表

 (4)GridView:網格圖,以表格形式顯示資源,可以左右滑動的

  5:事件

 (1)用戶單擊列表項事件

  ◆為列表加載setOnItemClieckListener監聽,重寫onItemClick(發生單擊事件的列表對象ListView,被單擊控件對象view,在列表中的位置position,被單擊列表項的行ID)方法。

 (2)用戶長按事件

  ◆為列表加載setOnItemLongClieckListener監聽,重寫onItemLongClick(發生單擊事件的列表對象ListView,被單擊控件對象view,在列表中的位置position,被單擊列表項的行ID)方法。

  6:數據填充

  借助下面的Adapter適配器對象從數據源中進行適配

二:Adapter-->C(控制器)

  1:作用

  把數據源中數據以某種樣式(xml文件)顯示在視圖中。

  2:分類

 (1)ArrayAdapter:他只能處理列表項內容全是文本的情況。

  ◆數據源:數組或者List<String>對象或者其他

 (2)SimpleAdapter: 他不僅可以處理列表項全是文本的情況,當列表項中還有其他控件時,同樣可以處理。

   ◆數據源:只能為List<Map<“鍵”,“值”>>形式的數據

 (3)自定義Adapter:根據xml文件中定義的樣式驚醒列表項的填充,適用性最強。

 (4)SimpleCursorAdapter:專門用於把游標中的數據映像到列表中(我們以后再來研究)

  3:自定義Adapter

  (1)創建類,繼承自BaseAdapter

  (2)重寫其中的四個方法

  ①int getCount():返回的是數據源對象的個數,即列表項數

  ②Object getItem(int position):返回指定位置position上的列表

  ③long getItemId(int position):返回指定位置處的行ID

  ④View getView():返回列表項對應的視圖,方法體中

  ◆實例化視圖填充器

  ◆用視圖填充器,根據Xml文件,實例化視圖

  ◆根據布局找到控件,並設置屬性

  ◆返回View視圖

三:數據填充

  1:聲明AdapterView對象,根據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對象);

 

 四:具體應用

1:用ArrayAdapter填充ListView  

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class MainActivity extends Activity {
    private ListView lv;// 適配器控件------->V視圖
    private ArrayAdapter<String> adapter;// 適配器------>C控制器
    private String[] data = { "我是第1個列表項""我是第2個列表項""我是第3個列表項""我是第4個列表項",
            "我是第5個列表項""我是第6個列表項""我是第7個列表項" };// 數據源-->M
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找到ListView
        lv = (ListView) findViewById(R.id.listView1);
        // 實現適配器,利用系統定義的樣式,加載數據源
        adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, data);
        // R.layout.cell 自己定義視圖
        // android.R.layout.simple_list_item_1 系統定義視圖樣式
        // 綁定適配器到適配器控件上
        lv.setAdapter(adapter);
        //處理單擊事件:列表項被單擊時給出提示信息
        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                Toast.makeText(MainActivity.this,
                        "第" + (position + 1) + "項被單擊按下", Toast.LENGTH_LONG)
                        .show();
            }
        });
        //處理長時間按下事件:列表項被長時間按下時給出提示信息
        lv.setOnItemLongClickListener(new OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view,
                    int position, long id) {
                Toast.makeText(MainActivity.this,
                        "第" + (position + 1) + "項被長時間按下", Toast.LENGTH_LONG)
                        .show();
                return true;
            }
        });
    }
}

   結果:

   2:用SimpleAdapter填充Spinner

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public  class  MainActivity  extends  Activity {
     //聲明Spinner
     private  Spinner sp;
     //聲明Adapter
     private  SimpleAdapter adapter;
     //數據源
     private  String[] data = {  "我是第1個列表項" "我是第2個列表項" "我是第3個列表項" "我是第4個列表項" ,
             "我是第5個列表項" "我是第6個列表項" "我是第7個列表項" "我是第8個列表項" "我是第9個列表項"  }; // 數據源-->M
     //存放數據源
     ArrayList<Map<String, Object>> list =  new  ArrayList<Map<String, Object>>();
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         //找到Spinner
         sp = (Spinner) findViewById(R.id.spinner1);
         //將數據添加到List<Map>中,因為SimpleAdapter只能裝這樣的數據
         Map<String, Object> map;
         for  ( int  i =  0 ; i < data.length; i++) {
             map =  new  HashMap<String, Object>();
             map.put( "data" , data[i]);
             list.add(map);
         }
         //實例化Adapter
         adapter =  new  SimpleAdapter( this , list, R.layout.cell,  new  String[] {
                 "data" },
                 new  int [] { R.id.textView1 });
         //綁定Adapter到Spinner上
         sp.setAdapter(adapter);
     }
}

   結果:

   3:用SimpleAdapter填充GridView

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public  class  MainActivity  extends  Activity {
     //聲明GridView
     private  GridView gv;
     //聲明SimpleAdapter
     private  SimpleAdapter adapter;
     //數據源
     private  int  imageids[] = { R.drawable.item1, R.drawable.item2,
             R.drawable.item3, R.drawable.item4, R.drawable.item5,
             R.drawable.item6, R.drawable.item7, R.drawable.item8,
             R.drawable.item9, R.drawable.item10, R.drawable.item11,
             R.drawable.item12, R.drawable.item13, R.drawable.item14,
             R.drawable.item15 };
     private  String data[] = {  "1" "2" "3" "4" "5" "6" "7" "8" "9" ,
             "10" "11" "12" "13" "14" "15"  };
     //存放數據
     private  List<Map<String, Object>> lists;
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         //找到GridView
         gv = (GridView) findViewById(R.id.gridView1);
         //封裝數據到List上
         lists =  new  ArrayList<Map<String, Object>>();
         Map<String, Object> maps;
         for  ( int  i =  0 ; i < imageids.length; i++) {
             maps =  new  Hashtable<String, Object>();
             maps.put( "image" , imageids[i]);
             maps.put( "data" , data[i]);
             lists.add(maps);
         }
         //適配數據到適配器上
         adapter =  new  SimpleAdapter( this , lists, R.layout.cell,  new  String[] {
                 "image" "data"  },
                 new  int [] { R.id.imageView1, R.id.textView1 });
         //綁定適配器到GridView上
         gv.setAdapter(adapter);
                                                      
                                                      
                                                      
     }
}

  結果:

 

   4:自定義AdapterView填充Gallery

   ◆自定義Adapter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//自定義Adapter
public  class  MyAdapter  extends  BaseAdapter {
     //上下文
     private  Context context;
     //資源
     private  int  imageids[];
     //構造方法
     public  MyAdapter(Context context,  int  imageids[]) {
         this .context = context;
         this .imageids = imageids;
     }
     //返回數據源長度
     @Override
     public  int  getCount() {
         return  imageids.length;
     }
     //返回對應位置處的數據
     @Override
     public  Object getItem( int  position) {
         return  imageids[position];
     }
     //返回對應位置的行ID
     @Override
     public  long  getItemId( int  position) {
         return  position;
     }
     //返回列表項的顯示樣式視圖
     @Override
     public  View getView( int  position, View convertView, ViewGroup parent) {
         //ImageView控件
         ImageView iv =  new  ImageView(context);
         //添加資源到控件上
         iv.setImageResource(imageids[position]);
         //控件在父級控件的顯示樣式
         iv.setLayoutParams( new  Gallery.LayoutParams(LayoutParams.FILL_PARENT,
                 LayoutParams.FILL_PARENT));
         //返回視圖
         return  iv;
     }
}

   ◆主視圖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public  class  MainActivity  extends  Activity {
     //聲明Gallery
     private  Gallery gy;
     //聲明自定義Adapter
     private  MyAdapter adapter;
     //數據源
     private  int  imageids[] = { R.drawable.w1,R.drawable.q1, R.drawable.q2, R.drawable.q3,
             R.drawable.q4, R.drawable.q5, R.drawable.q6, R.drawable.q7, R.drawable.q8, R.drawable.q9 };
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         //找到Gallery
         gy = (Gallery) findViewById(R.id.gy);
         //實例化適配器
         adapter =  new  MyAdapter( this , imageids);
         //綁定適配器到Gallery上
         gy.setAdapter(adapter);
     }
}

   ◆結果

 

本文轉自:http://cinderella7.blog.51cto.com/7607653/1281696

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM