Android Adapter 詳解

學習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()包含頁眉和頁腳,專業的適配器可能想要一個不同的行爲。


第一次寫博客,寫這麼點東西花了將近兩個小時敲打,主要是字體的顏色啊,圖片什麼的不太會,在想是不是都現在項目裏寫的,在複製到這裏面,不過第一次嗎,慢慢就好了,對吧,嘻嘻。裏面可能有什麼不好的地方或者不對的地方,請多多指教,我會耐心的更改的。

讓我們一起進步,一起成長。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章