Android Adapter的幾個方法

來源:互聯網
上載者:User

標籤:

1  ListView是在什麼時候設定對Adapter的資料監聽的?

在setAdapter(ListAdapter adapter)中,會先取消ListView中原來的mAdapter中的資料監聽(mAdapter.unregisterDataSetObserver(mDataSetObserver);),然後再設定對新設定的adapter的資料監聽。

2  getView(int position, View convertView, ViewGroup parent)

我們都知道mAdapter的getView方法很重要,那麼該方法在ListView是怎麼被利用的呢? 在ListView的源碼中沒有發現getView方法的調用,於是我們去ListView的父類AbsListView。在AbsListView中的obtainView中調用了getView,其主要代碼邏輯部分為:

 1     View obtainView(int position, boolean[] isScrap) { 2         isScrap[0] = false; 3         View scrapView; 4         //從回收器中擷取view 5         scrapView = mRecycler.getScrapView(position); 6  7         View child; 8         if (scrapView != null) { 9             ...10             //若不為空白,則傳入convertView,這樣的話重用了view,同時更新了資料11             child = mAdapter.getView(position, scrapView, this);12             ...13         } else {14             //若為空白,則在getView中重新建立HolderView,且填入資料15             child = mAdapter.getView(position, null, this);16             ...17         }18         return child;19     }

而obtainView又會在ListView的measure以及產生整個ListView等中用到。

對於重寫getView方法最終要的應該就是要記得convertView的重用了,沒有重用幾乎都會造成記憶體卸了。

3  getCount()

Adapter的getCount()用來幹啥?  在ListView中,在onMeasure以及觸控分發響應等過程中都會用到Adapter的getCount()函數。毫無疑問的是:它應該返回底層資料的資料個數。

4  getItem(int position)

getItem()在AdapterView中被調用,然後供使用者調用:從這兩個函數的描述我們可以看出,我們應該在Adapter的getItem()方法中返回position對應的資料,但是不是說一定要返回用於在Item的View上展示的資料,這個還是看需求,雖然可能大部分情況都是返回View中展示的資料。

    /**     * Gets the data associated with the specified position in the list.     *     * @param position Which data to get     * @return The data associated with the specified position in the list     */    public Object getItemAtPosition(int position) {        T adapter = getAdapter();        return (adapter == null || position < 0) ? null : adapter.getItem(position);    }        /**     * @return The data corresponding to the currently selected item, or     * null if there is nothing selected.     */    public Object getSelectedItem() {        T adapter = getAdapter();        int selection = getSelectedItemPosition();        if (adapter != null && adapter.getCount() > 0 && selection >= 0) {            return adapter.getItem(selection);        } else {            return null;        }    }

縱觀整個結構,可以說存在這樣的三層:dataLists(原底層資料)--Adapter--AdapterView,有了getItem()方法的存在,我們可以直接利用Adapter來擷取資料,而不需要擷取底層dataLists的引用;有了getItemAtPosition()方法的存在,我們可以直接利用AdapterView 擷取底層資料,而不需要擷取其Adapter的引用。這樣的話,對於編程的簡便性以及解耦性都好很多。

5    getItemId(int position)

在AdapterView中發現它的一些調用, 

 1     public long getItemIdAtPosition(int position) { 2         T adapter = getAdapter(); 3         return (adapter == null || position < 0) ? INVALID_ROW_ID : adapter.getItemId(position); 4     } 5      6      7     private void fireOnSelected() { 8         if (mOnItemSelectedListener == null) 9             return;10 11         int selection = this.getSelectedItemPosition();12         if (selection >= 0) {13             View v = getSelectedView();14             //這裡調用的getItemId得到的傳回值與selection都屬於同一個item的特徵,其意義也就在於在選擇介面的onItemSelected方法中可15             //以直接拿到該item的id,而不需要通過擷取adapter來間接實現16             mOnItemSelectedListener.onItemSelected(this, v, selection,17                     getAdapter().getItemId(selection));18         } else {19             mOnItemSelectedListener.onNothingSelected(this);20         }21     }22     23     int findSyncPosition() {24         ...25             rowId = adapter.getItemId(seed);26             if (rowId == idToMatch) { //從這裡來看,getItemId似乎應該對於不同的item返回不同的值,保持唯一性27                 // Found it!28                 return seed;29             }30         ...31     }

與上面分析的getItem()方法一樣,getItemId()和getItemIdAtPosition()都提供了編程上面的便利。但是目前來看,由於對id沒啥需求,所以大部分在重寫getItemId方法時都是直接返回的position值,這樣做也是對的,雖然從資料擷取上沒啥意義(我給你一個position,你原封不動的返回給我,啥意思)。但是我想說明的是,不要被這個做法所限制,而以為ItemId就是item在資料中的position。其實若有需求,可以利用getItemId()方法返回一些其他的值,比如每個item資料在資料庫中id值,或者每個人的社會安全號碼等。

Android Adapter的幾個方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.