Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android編程入門 >> Android控件第3類——AdapterView

Android控件第3類——AdapterView

編輯:Android編程入門

 

  AdapterView這一類控件的最大特點,在絕大多數的情況下,它們的數據都由Adapter的子類提供(有時可以在控件的entries屬性上直接設置顯示的數據)。

  調用AdapterView的setAdapter(Adapter)將控件與數據關聯。

 

一、概述

  AdapterView是一個抽象類,她繼承了GroupView,所以它是一個容器類。它有三個子類:AbsListView、AbsSpinner、AdapterViewAnimator,這三個子類也都是抽象類。與之對應的Adapter是一個接口,它包含兩個接口:ListAdapter、SpinnerAdapter。AdapterViewAnimator的子類通常用於滑動顯示上一個、下一個控件。

  為AbsListView子類添加數據的時候,使用setAdapter(ListAdapter);為AbsSpinner子類添加數據的時候,使用setAdapter(SpinnerAdapter);為AdapterViewAnimator子類添加數據的時候調用setAdapter(Adapter),也就是說,為AdapterViewAnimator子類提供數據的時候,既可以使用ListAdapter、也可以使用SpinnerAdapter。其實,在實際的使用中,並不會有太大的分別。因為在實際使用中,通常都會使用BaseAdapter及其子類(ArrayAdapter、SimpleAdapter、CursorAdapter、ResourceCursorAdapter、SimpleCursorAdapter),而BaseAdapter實現了ListAdapter和SpinnerAdapter兩個接口。

  需要注意的是ListView的子類ExpandableListView。正常的情況下,這個類應該調用setAdapter(ListAdapter)來關聯數據。但是根據ExpandableListView呈現數據的特殊要求,setAdapter(ListAdapter)不能滿足要求,所以這個方法將拋出異常;同時,該類提供了setAdapter(ExpandableListAdapter),用於關聯數據。ExpandableListAdapter並沒有繼承Adapter或ListAdapter,它沒有繼承任何接口。它的實現類包括BaseExpandableListAdapter、SimpleExpandableListAdapter、CursorTreeAdapter、ResourceCursorTreeAdapter、SimpleCursorTreeAdapter,其中,第1、2、5比較常用。

 

二、常用控件

1、AbsListView,繼承自AdapterView,需要使用setAdapter(ListAdapter)關聯數據

  android:choiceMode,設置AbsListView選擇行為,單選/多選(none/singleChoice/multipleChoice/multipleChoiceModal)

  android:drawSelectorOnTop(setDrawSelectorOnTop(boolean)),為true,則選中的項會顯示到最上面

  android:listSelector(setSelector(int)),指定被選中的列表項上繪制的Drawable

 

2、ListView,繼承自AbsListView,需要使用setAdapter(ListAdapter)關聯數據

  可以使用Activity+ListView(自己添加ListView控件)

  也可以直接使用ListActivity,這個Activity自帶ListView

  android:divider,列表項的分隔符,可以是顏色,也可以是Drawable

  android:dividerHeight,分隔符高度

  android:entries,指定一個數組,用於指示要顯示的數據

 

3、GridView,繼承自AbsListView,需要使用setAdapter(ListAdapter)關聯數據

  GridView與ListView相似。不同點是ListView只顯示一列,而GridView可以顯示多列。如果GridView只設置了一列,就和ListView一樣了。

  可以通過android:numColumns(setNumColumns(int))來設置要顯示的列數。

  

4、AutoCompleteTextView,繼承自TextView,需要使用setAdapter(ListAdapter)關聯數據

  沒有繼承AdapterView及其子類,它也使用setAdapter為其提供數據,所以放在這裡。

  它的setAdapter方法的聲明如下:public <T extends ListAdapter & Filterable> void setAdapter(T adapter) {......}

 

5、MultiAutoCompleteTextView,繼承自AutoCompleteTextView,需要使用setAdapter(ListAdapter)關聯數據

  與AutoCompleteTextView基本相似。只是MultiAutoCompleteTextView可以多次輸入,並且多次匹配Adapter中的信息。兩次輸入之間用setTokenizer(MultiAutoCompleteTextView.Tokenizer)來設置。而MultiAutoCompleteTextView提供了一個Tokenizer——CommaTokenizer。這個Tokenizer表示逗號。其寫法為setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer())。

 

6、Spinner,繼承自AbsSpinner,需要使用setAdapter(SpinnerAdapter)關聯數據

  Spinner是提供用戶選擇的列表框,類似於下拉列表框。

 

7、Gallery,繼承自AbsSpinner,需要使用setAdapter(SpinnerAdapter)關聯數據,已經不推薦使用

  Spinner是一個垂直的,Gallery是一個水平的。

  Spinner提供用戶選擇,Gallery通常用於查看,可以通過上下滑動查看上一個、下一個列表項。

  現在已經不推薦使用Gallery,而是使用HorizontalScrollView和ViewPager來代替。

 

8、AdapterViewAnimator,繼承自AdapterView,需要使用setAdapter(Adapter)關聯數據

  一次只能顯示一個View(View由Adapter.getView()方法提供)

  通過showPrevious()和showNext()顯示上一個和下一個View

  android:animateFirstView屬性,顯示第一個View的時候是否使用動畫

  android:inAnimator,android:outAnimator屬性,顯示和隱藏時使用的動畫

  android:loopViews屬性,循環結束後是否從第一個View重新開始循環

 

8、AdapterViewFlipper,繼承自AdapterViewAnimator,需要使用setAdapter(Adapter)關聯數據

  android:autoStart屬性/startFlipping()方法開始自動播放,stopFlipping()方法停止自動播放。

  android:flipInterval屬性/setFlipInterval(int)方法設置自動播放的事件間隔。

 

9、StackView,繼承自AdapterViewAnimator,需要使用setAdapter(Adapter)關聯數據

  與AdapterViewFilpper不同的是,StackView以堆疊的方式顯示多個列表項

  拖走StackView頂端的View,將會顯示下一個View;將上一個View拖進StackView,則那個View就會顯示。

  也可以通過showPrevious、showNext顯示上一個、下一個

 

10、ExpandableListView,繼承自ListView,需要使用setAdapter(ExpandableListAdapter)關聯數據

  它是一個多層次的ListView,有組和組內成員兩種。

  android:childDivider屬性,組內各子列表項之間的分隔條;android:divider屬性,組之間的分隔條。

  android:childIndicator屬性,子列表項旁邊的Drawable對象;android:groupIndicator,組列表項旁邊的Drawable對象。

  有兩個setAdapter,其中一個是繼承自ListView的setAdapter(ListAdapter),為了防止使用這個方法,這個方法拋出異常。

  常用的ExpandableListAdapter的子類包括:BaseExpandableListAdapter、SimpleExpandableListAdapter、CursorTreeAdapter、ResourceCursorTree、SimpleCursorTreeAdapter。

  使用SimpleExpandableListAdapter時需要注意,對應的Layout只能設置TextView,因為Android在實現SimpleExpandableListAdapter的時候,在bindView方法中,將控件強制轉換成TextView,而getGroupView和getChildView兩個方法都調用了bindView方法。而SimpleAdapter沒有這樣的強制類型轉換,所以可以在Layout上自由的添加控件。

  如果使用BaseExpandableListAdapter,需要實現其方法。比較重要的方法為:

    •   getGroupCount
    •   getGroupView
    •   getChildrenCount
    •   getChildView

  

 

三、Adapter及其子類

 

1、ArrayAdapter,繼承自BaseAdapter

  new一個ArrayAdapter,通常調用三個參數的構造函數:

    •   Context
    •   用於呈現單個列表項的ResourceId
    •   List/數組對象作為參數傳遞到構造函數中。

 

2、SimpleAdapter,繼承自BaseAdapter

  與ArrayAdapter類似,new一個SimpleAdapter,只是參數略復雜。一共5個參數:

    •   Context
    •   一個用於存放數據的List<? extends Map<String,?>>
    •   用於呈現單個列表項的ResourceId
    •   String[],用於與第2個參數中Map<String,?>中的String對應的字符串數組
    •   int[],表示的是控件id,與第三個參數和第四個參數對應。第三個參數可以是一個復雜的控件組合,int數組中的每一項,對應著第三個參數中的一個控件的Id,同時也對應著第4個參數中的一個String字段。表示第2個參數中的String字段對應的數據,顯示在第3個參數對應的控件上。

 

3、BaseAdapter,實現了ListAdapter和SpinnerAdapter

  BaseAdapter是一個抽象類,需要實現其方法。

  最重要的,需要實現其getView方法:public view getView(int position, View convertView, ViewGroup parent)

  在getView方法的參數中,最值得注意的是第2個參數,convertView。如果需要顯示的項比較多,一屏無法顯示,就會顯示滾動條。這個參數代表的就是在滾動條滾動的時候,剛剛被隱藏起來的那個View。這個View因為已經隱藏起來了,我們可以利用這個View來呈現剛剛顯示出來的這個View,而不是重新創建一個View。這樣就極大的降低了內存和時間的消耗。

 

4、BaseExpandableListAdapter

  它是一個抽象方法,它的子類中比較常用的包括:SimpleExpandableListAdapter、SimpleCursorTreeAdapter

  如果在代碼中使用BaseExpandableListAdapter,要實現其方法,比較重要的方法有:

    •   public int getChildrenCount(int groupPosition)
    •   public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)
    •   public int getGroupCount()
    •   public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)

 

5、SimpleExpandableListAdapter

  它的參數如下:

    •    context  與SimpleExpandableListAdapter關聯的ExpandableListView的上下文。
    •      groupData  一個Maps列表(List)。集合中的每個字典項與可折疊列表中的每個組元素一致。字典項提供了組元素包含的所有數據,並包含所有在"groupFrom"中指定的記錄。
    •   expandedGroupLayout   定義組展開時的View的XML資源布局。該布局文件應當至少包括所有在groupTo中所定義的View。(即groupTo中的View id數組必須都在該布局文件中找到)
    •   collapasedGroupLayout   定義組折疊時的View的XML資源布局。該布局文件應當至少包括所有在groupTo中所定義的View。(即groupTo中的View id數組必須都在該布局文件中找到)
    •      groupFrom      一個鍵值列表。對應與組相關聯的Map中的鍵值。
    •    grouptTo   組View應當顯示groupFrom參數中的所有列數據。這些數據應當都用TextView來顯示。列表中的前N個View從前N個groupFrom參數獲得列元素的數據。
    •      childData        一個Map列表的列表。外部列表中的每個實體對應一個組(按照組的位置編號)。在內部列表的每個實體對應某個組的子元素(按照子元素的位置編號)。該Map對應了子元素的數據。(按照childFrom數組中的值編號)。該Map包含了每個子元素的數據,並且應當包括所有在childFrom中指定的實體。
    •      childLayout      顯示子元素的資源文件。該資源文件定義了如何顯示子元素。布局文件至少應該包括所有在childTo中定義的View。(即childTo中的view id數組必須都在該布局文件中找到)
    •    lastChildLayout 定義每組中最後一個子元素的View資源布局情況。該布局文件應當至少包括所有在childTo中所定義的View。(即childTo中的View id數組必須都在該布局文件中找到)
    •    childFrom       定義顯示子元素的列名。該列名與childData中的子元素屬性(字典鍵值)對應。
    •      childTo       子View應當顯示childFrom參數中的所有列數據。這些數據應當都用TextView來顯示。列表中的前N個View從前N個childFrom參數獲得列元素的數據。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved