編輯: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,需要實現其方法。比較重要的方法為:
三、Adapter及其子類
1、ArrayAdapter,繼承自BaseAdapter
new一個ArrayAdapter,通常調用三個參數的構造函數:
2、SimpleAdapter,繼承自BaseAdapter
與ArrayAdapter類似,new一個SimpleAdapter,只是參數略復雜。一共5個參數:
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,要實現其方法,比較重要的方法有:
5、SimpleExpandableListAdapter
它的參數如下:
通常情況下,Android實現自定義控件無非三種方式。 Ⅰ、繼承現有控件,對其控件的功能進行拓展。 Ⅱ、將現有控件進行組合,實現功能更加強大控件。 Ⅲ、重寫View
阿裡客戶端工程師試題簡析——Android應用的閃退(crash)分析1. 問題描述 閃退(Crash)是客戶端程序在運行時遭遇無法處理的異常或
我們在平時做開發的時候,免不了會用到各種各樣的對話框,相信有過其他平台開發經驗的朋友都會知道,大部分的平台都只提供了幾個最簡單的實現,如果我們想實現自己特定需求的對話框,
Camera的架構與Android系統的整體架構保持一致,如下圖所示,本文主要從以下四個方面對其進行說明。 Framework:Camera.java Android