學習Android 也有一段時間,不得不說我做的很失敗,甚至是連菜鳥都算不上,只研究表面不研究深層次的東西,論壇不逛,博客不寫。今天不知受了什麼刺激或者是腦袋哪根弦搭錯了,決定好好學習下,順便把自己的過程記錄下來。如果有寫的不好的地方,不全面的地方,請多多體諒,歡迎指正,交流,請教。
好了,廢話不多說了,開始我的第一篇博客之旅....
從公司的最近項目開始吧,項目是能做出來,可是並不是全都瞭解原理,那就一點點開始吧。首先登錄用的是AutoCompleteAdater,繼承關係爲AutoCompleteAdater---SimpleCursorAdapter---ResourceCursorAdapter--CursorAdapter--BaseAdapter--- 實現了ListAdapter, SpinnerAdapter----最後到Adapter.放一個網上都存在的圖吧。
由圖可以看到在Android中與Adapter有關的所有接口、類的完整層級圖。我也是一點點的研究,就從最基本的adapter開始吧。
先來一張圖吧
這個許多地方也都存在,但是我覺得還是放上比較好。用有道翻譯出來的源碼解釋是(英語水平不太好)一個適配器充當橋樑在adapterview視圖和基礎數據之間,適配器還負責做數據集合中的每一項的視圖(Android view)。通俗來說就是數據和界面的紐帶。
Adapter中的方法
先說比較常用的方法吧:
//適配器中所表示的數據的項數
int getCount();
//得到指定位置的數據
Object getItem(int position);
//得到相關行id列表中指定的位置,返回項的指定位置
long getItemId(int position);
//得到一個視圖顯示數據集的數據在指定位置,你可以創建一個視圖或者導入一個xml佈局文件,當導入的時候,父視圖(gridview,listview..)將默認佈局參數,除非你使用 android.view.LayoutInflater#inflate(int, android.view.ViewGroup, boolean)指定根視圖。
//三個參數 position我們想要的數據集內位置的視圖
convertView老視圖的重用,如果可能,你應該在使用前檢查非空和適當的類型這一項,如果這個視圖不可能顯示正確的數據,這種方法可以創建一個新的視圖。
異構列表可以顯示他們正確的視圖類型,所以這個視圖總是正確的類型,見getViewTypeCount(),getItemViewType(int)
parent 父視圖
返回 視圖 對應的數據在指定的位置。
View getView(int position, View convertView, ViewGroup parent);
這是最常用的幾個方法,自定義的類的話通常要實現這幾個方法。
下面是幾個不常用的屬性和方法:
1、 static final int IGNORE_ITEM_VIEW_TYPE = AdapterView.ITEM_VIEW_TYPE_IGNORE;
//某項視圖類型導致忽略此項目視圖 例如客戶不希望特定視圖的轉換,此視圖不會被重用。
2、 static final int NO_SELECTION = Integer.MIN_VALUE;
// 沒有介紹(猜測:沒有選擇的項時,賦予整數最小值,有待確定,知道的同學可以告訴下)
3、 void registerDataSetObserver(DataSetObserver observer);
// 註冊一個Observer,當Adapter所表示的數據改變時會通知它,DataSetObserver是一個抽象類,定義了兩個方法:onChanged與onInvalidated
4、 void unregisterDataSetObserver(DataSetObserver observer);
// 取消註冊一個Observer (觀察者)
5、 boolean hasStableIds();
// 在基礎數據中顯示條目id是否是穩定的,如果相同的id總是指同一個對象,則返回true
6、 int getItemViewType(int position);
// 得到指定項的視圖類型。整數代表視圖的類型,
如果一個可以轉化成其他的,兩個視圖可以共享相同的數據類型。注意:整數範圍0到-1將被歸還
7、 int getViewTypeCount();
// 返回在getView()中將被創建的視圖類型的數量,每種類型代表一種視圖,可以轉換,
如果在所有項目類型的視圖中總是返回相同的,那麼這個方法返回1,
8、 boolean isEmpty();
// 如果這個適配器不包含任何數據,返回true,這個用來確定是否返回空視圖。
典型的實現是getCount()==0,但是getCount()包含頁眉和頁腳,專業的適配器可能想要一個不同的行爲。
第一次寫博客,寫這麼點東西花了將近兩個小時,主要是字體的顏色啊,圖片什麼的不太會,在想是不是都現在項目裏寫的,在複製到這裏面,不過第一次嗎,慢慢就好了,對吧,嘻嘻。裏面可能有什麼不好的地方或者不對的地方,請多多指教,我會耐心的更改的。
讓我們一起進步,一起成長。