android-UI組件(四):AdapterView及其子類


http://blog.csdn.net/litianpenghaha/article/details/23270881

AdapterView組件是一組重要的組件,AdapterView本身是一個抽象基類,它派生的子類在用法上十分相似,知識顯示界面有些不同,

下面是AdapterView及其子類的繼承關系類圖:

從AdapterView派生出的三個子類:AdsListView、AdsSpinner、AdapterViewAnimator,這3個子類依然是抽象的,實際運用時需要它們的子類。

1、ListView(列表視圖)和ListActivity:

ListView應用十分廣泛,它以垂直列表的形式顯示所有的列表項,

創建ListView的兩種方法:

(1)直接使用ListView創建;

(2)讓Activity繼承ListActivity,就是該Activity顯示的組件為ListView

注意:ListView、GridView、Spinner、Gallery等AdapterView只是容器,而Adapter負責提供每個“列表項”組件,AdapterView負責采用合適的方式顯示這些列表項。

AbsListView的XML屬性如下:

 
ListView提供了如下的XML屬性:
 
如果想對ListView的外觀、行為進行定制,就要把ListView作為AdapterView使用,通過Adapter控制每個列表的外觀和行為。
 
2、Adapter接口及其實現類:
下面是其關系圖:
Adapter接口派生出了ListAdapter和SpinnerAdapter兩個子接口,可以看出,幾乎所有的Adapter都繼承BaseAdapter。
Adapter常用的實現類如下:
 
通過ArrayAdapter實現的Adapter很簡單,其功能也比較有限,而且它的每個列表都只能是TextView,如果要實現復雜的功能,則可以使用SimpleAdapter。
下面給出SimpleAdapter的一個實例:
activity_simple.xml如下:
[html]  view plain  copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical"  
  6.     android:paddingBottom="@dimen/activity_vertical_margin"  
  7.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  8.     android:paddingRight="@dimen/activity_horizontal_margin"  
  9.     android:paddingTop="@dimen/activity_vertical_margin"  
  10.     tools:context=".SimpleActivity" >  
  11.   
  12.     <ListView  
  13.         android:id="@+id/mylist"  
  14.         android:layout_width="match_parent"  
  15.         android:layout_height="wrap_content" >  
  16.     </ListView>  
  17.   
  18. </LinearLayout>  

simple_item.xml如下:
[html]  view plain  copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:orientation="horizontal" >  
  6.   
  7.     <ImageView  
  8.         android:id="@+id/header"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:paddingLeft="10dp" >  
  12.     </ImageView>  
  13.   
  14.     <LinearLayout  
  15.         android:layout_width="match_parent"  
  16.         android:layout_height="wrap_content"  
  17.         android:orientation="vertical" >  
  18.   
  19.         <TextView  
  20.             android:id="@+id/name"  
  21.             android:layout_width="wrap_content"  
  22.             android:layout_height="wrap_content"  
  23.             android:paddingLeft="10dp"  
  24.             android:textColor="#f0f"  
  25.             android:textSize="20sp" >  
  26.         </TextView>  
  27.   
  28.         <TextView  
  29.             android:id="@+id/desc"  
  30.             android:layout_width="wrap_content"  
  31.             android:layout_height="wrap_content"  
  32.             android:paddingLeft="10dp"  
  33.             android:textSize="14sp" >  
  34.         </TextView>  
  35.     </LinearLayout>  
  36.   
  37. </LinearLayout>  

[java]  view plain  copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. package com.simpleadapter;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import android.os.Bundle;  
  9. import android.app.Activity;  
  10. import android.view.Menu;  
  11. import android.view.View;  
  12. import android.widget.AdapterView;  
  13. import android.widget.AdapterView.OnItemClickListener;  
  14. import android.widget.AdapterView.OnItemSelectedListener;  
  15. import android.widget.ListView;  
  16. import android.widget.SimpleAdapter;  
  17.   
  18. public class SimpleActivity extends Activity {  
  19.   
  20.     private String[] names = { "虎頭", "弄玉", "李清照", "李白" };  
  21.     private String[] descs = { "可愛的孩子", "一個擅長音樂的女孩", "一個擅長寫詞的女性", "一個偉大的浪漫主義詩人" };  
  22.     private int[] imageIds = new int[] { R.drawable.tiger, R.drawable.nongyu,  
  23.             R.drawable.qingzhao, R.drawable.libai };  
  24.   
  25.     @Override  
  26.     protected void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.activity_simple);  
  29.         List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();  
  30.         for (int i = 0; i < names.length; ++i) {  
  31.             Map<String, Object> listItem = new HashMap<String, Object>();  
  32.             listItem.put("header", imageIds[i]);  
  33.             listItem.put("name", names[i]);  
  34.             listItem.put("desc", descs[i]);  
  35.             listItems.add(listItem);  
  36.         }  
  37.         SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,  
  38.                 R.layout.simple_item,  
  39.                 new String[] { "name", "header", "desc" }, new int[] {  
  40.                         R.id.name, R.id.header, R.id.desc });  
  41.         ListView list = (ListView) findViewById(R.id.mylist);  
  42.         list.setAdapter(simpleAdapter);  
  43.   
  44.         // ListView的列表項的單擊事件綁定事件監聽器  
  45.         list.setOnItemClickListener(new OnItemClickListener() {  
  46.   
  47.             @Override  
  48.             public void onItemClick(AdapterView<?> parent, View view,  
  49.                     int position, long id) {  
  50.                 System.out.println(names[position] + "被單擊了");  
  51.             }  
  52.   
  53.         });  
  54.   
  55.         // 為ListView的列表項的選中事件綁定事件監聽器  
  56.         list.setOnItemSelectedListener(new OnItemSelectedListener() {  
  57.   
  58.             @Override  
  59.             public void onItemSelected(AdapterView<?> parent, View view,  
  60.                     int position, long id) {  
  61.                 System.out.println(names[position] + "被選中了");  
  62.             }  
  63.   
  64.             @Override  
  65.             public void onNothingSelected(AdapterView<?> arg0) {  
  66.   
  67.             }  
  68.         });  
  69.     }  
  70.   
  71.     @Override  
  72.     public boolean onCreateOptionsMenu(Menu menu) {  
  73.         // Inflate the menu; this adds items to the action bar if it is present.  
  74.         getMenuInflater().inflate(R.menu.simple, menu);  
  75.         return true;  
  76.     }  
  77.   
  78. }  
運行界面如下:


點擊或者選中按鈕時在LogCat上面會有顯示。
 
3、AutoCompleteTextView(自動完成文本框):
AutoCompleteTextView從EditText派生而來,實際上也是一個文本編輯框,但是它比普通的編輯框多一個功能:當用戶輸入一定的字符之后,自動完成文本框會顯示一個下拉菜單,供用戶從中選擇,當用戶選擇某個菜單項之后,AutoCompleteTextView會按照用戶的選擇自動填寫該文本框。
AutoCompleteTextView除了支持EditText的屬性方法之外,還支持如下的XML屬性以及方法:
 
AutoCompleteTextView派生一個子類:MultiAutoCompleteTextView,該子類的功能與AutoCompleteTextView基本相似,只是MultiAutoCompleteTextView比AutoCompleteTextView允許輸入多個提示項,以分隔符分隔。
 
4、GridView(網格視圖):
GridView用於在界面上按行列分布的方式來顯示多個組件,GridView和ListView具有相同的父類:AbsListView,因此GridView和ListView很相似,但是ListView只顯示一列,GridView可以顯示多列
GridView常用的XML屬性:
注意:使用GridView一般都會設置numColumns大於1,否則該默認值為1,則意味着該GridView只有一列,就相當於ListView了。
上表中android:stretchMode屬性支持如下屬性值:
 
5、ExpandableListView(可展開的列表組件):
 
ExpandableListView是ListView的子類,它在普通ListView的基礎上進行擴展,把應用中的列表項分為幾組,每組又可以包含多個列表項,ExpandableListView與普通的ListView用法十分相似,只是
ExpandableListView所顯示的列表應該由ExpandableListAdapter提供,下面是其繼承關系圖:
實現ExpandableListAdapter的3種常用方式:
下面顯示ExpandableListView支持的XML屬性:
 
6、Spinner:
Spinner組件就是一個列表選擇框,這里相當於彈出一個菜單供用戶選擇。Spinner繼承AbsSpinner,AbsSpinner繼承AdapterView,因此Spinner表現出ApdaterView的特征,下面顯示了Spinner的XML屬性:
注意:上面的android:entries屬性並不是Spinner定義的,而是在AbsSpinner中定義的,
 
7、Gallery(畫廊視圖):
Gallery繼承AbsSpinner,且Gallery顯示的也是一個列表框,但是Gallery顯示的是一個水平的列表框,Spinner顯示的是一個垂直的列表框。它們之間的區別還有:Spinner作用是供用戶選擇,而Gallery則允許用戶通過拖動來查看上一個、下一個列表項。
Gallery提供的XML屬性:
注意:android已經不再推薦使用Gallery組件,而是推薦使用其他的水平滾動組件HorizontalScrollView和ViewPager來代替Gallery。
 
8、AdapterViewFipper:
AdapterViewFipper繼承AdapterViewAnimator,下面是其支持的XML屬性:
它額外指定的屬性:
 
9、StackView:
StackView也是AdapterViewAnimator的子類,StackView以“堆疊”的方式來顯示多個列表項,
StackView提供的兩種控制方式:


免責聲明!

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



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