android自定義AdapterView

    相信不少Android開發人員都有用過ListView, GridView,感受就是設置一些屬性,寫一個adapter,而後就OK了。可是你有研究過他們的內部實現嗎,若是就是隻停留在調用API的層面,可算不上好的技術人員呀,兄弟我在這裏拋磚引玉,介紹他們的內部實現,但願能夠幫助部分朋友。android

    ListView, GridView都繼承自AbsListView,而AbsListView又繼承自AdapterView。android裏面使用adapter的view都須要繼承自AdapterView,我在這裏先從AdapterView講起,AbsListView我將會在之後的文章中說起。緩存

    在AdapterView中addView和removeView函數沒法使用,由於在AdapterView的源碼中以下:函數

    public void addView(View child) {.net

        throw new UnsupportedOperationException("addView(View) is not supported in AdapterView");繼承

    }內存

     public void removeView(View child) {開發

        throw new UnsupportedOperationException("removeView(View) is not supported in AdapterView");rem

    }get

     在AdapterView中添加,刪除子view必須經過addViewInLayout,和removeViewInLayout函數。源碼

     若是自定義View,你須要重寫onMeasure函數;若是自定義ViewGroup,你還須要重寫onLayout函數。由於AdapterView繼承自ViewGroup,因此理論上你須要重寫onMeasure,和onLayout兩個函數。可是經過addViewInLayout和removeViewInLayout這兩個函數名稱你或許能夠猜得出來,他們都須要在onLayout函數中被調用。並且爲了不屢次循環子view,因此在個人demo中對子view的測量和位置的放置都寫在onLayout函數中。

    經過AdapterView實現相似ListView的控件,有兩個功能必須考慮:超出屏幕範圍的子view的刪除,和對子view的緩存。刪除超出屏幕範圍的子view,必需要根據子View的位置和座標偏移量作相應的計算,若是發現一個子View超出屏幕,應該調用removeViewInLayout函數將它刪除,將刪除的子view緩存在一個集合中。每次調用adapter.getView函數的時候,獲取緩存集合中的第一個元素,而且將它從列表中刪除,已避免沒必要要的內存泄露。將從列表中取得的這個緩存的元素傳遞給adapter.getView的第二個參數。

    兄弟我第一次寫技術博客,文筆拙劣,可能還有不少地方沒有將清楚,若是有疑惑的朋友能夠經過個人郵箱和我聯繫:326018204@qq.com

    另外我把個人Demo的源碼放上來,有須要的朋友能夠查看源碼。須要說一下,源碼中沒有添加觸屏慣性滾動的功能,這個請朋友們理解下,畢竟時間有限,之後要有時間我會再補充上去。

     下載地址:http://download.csdn.net/detail/liuyunprogramer/9463633

相關文章
相關標籤/搜索