ListView解析
直接繼承自AbsListView,AbsListView繼承自AdapterView,AdapterView又繼承自ViewGroup。算法
Adpater在ListView和數據源之間起到了一個橋樑的做用數組
RecycleBin機制緩存
RecycleBin機制是ListView可以實現成百上千條數據都不會OOM最重要的一個緣由。RecycleBin是AbsListView的一個內部類。
- RecycleBin當中使用mActiveViews這個數組來存儲View,調用這個方法後就會根據傳入的參數來將ListView中的指定元素存儲到mActiveViews中。
- mActiveViews當中所存儲的View,一旦被獲取了以後就會從mActiveViews當中移除,下次獲取一樣位置的時候將會返回null,因此mActiveViews不能被重複利用。
- addScrapView()用於將一個廢棄的View進行緩存,該方法接收一個View參數,當有某個View肯定要廢棄掉的時候(好比滾動出了屏幕)就應該調用這個方法來對View進行緩存,RecycleBin當中使用mScrapV
- iews和mCurrentScrap這兩個List來存儲廢棄View。
- getScrapView 用於從廢棄緩存中取出一個View,這些廢棄緩存中的View是沒有順序可言的,所以getScrapView()方法中的算法也很是簡單,就是直接從mCurrentScrap當中獲取尾部的一個scrap view進行返回。
- 咱們都知道Adapter當中能夠重寫一個getViewTypeCount()來表示ListView中有幾種類型的數據項,而setViewTypeCount()方法的做用就是爲每種類型的數據項都單獨啓用一個RecycleBin緩存機制。
到此爲止,這就很好的解釋了爲何Listview加載上百條數據都不會形成OOM了的緣由了