ListView是安卓中很經常使用的一個控件。
安卓設計使用Adapter來對ListView進行管理。
可是系統提供的Adapter無法滿足一些復雜的顯示情況,這個時候我們就須要使用BaseAdapter來自行實現ListView的控制。
其它的方法都非常好說。這里主要解釋一下getView方法。
首先ListView在設計時,為了保障系統的性能(畢竟是移動終端,系統資源有限),設計時並非無限載入ItemView進去的。
試想一下,假設有1000條記錄。難道要同一時候創建。並緩存1000個 ItemView對象嗎?假設還包括圖片等大型資源呢?
顯然是不現實的。所以安卓設計時,採用了例如以下設計思路。
如上圖所看到的。系統僅僅會創建一屏ItemView。詳細個數依據屏幕顯示控件計算得到。
當第一個itemView徹底被遮蓋時,系統會移動它作為最后一個ItemView顯示。
這樣就保證始終僅僅有7個ItemView被實例化。
可是顯然Item8和Item1顯示內容是不一樣的,這時候。我們就須要用到GetView這種方法了。
getView中的convertView,事實上就是屏幕顯示的ItemView的引用。
在第一屏數據顯示是,convertView為空。由於他們都須要被又一次創建。
在第二屏第一項數據被展示時。convertView就不在是空,而是被移動下來的第一屏第一項的View對象。
這時候我們須要做的,就是又一次把新的數據填充上去,保證它顯示的是第二屏第一項的數據就可以。
詳細參考鏈接:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html
至於我們經常見到的PlaceHolder這個東西,好吧,事實上他僅僅是一個經常使用的方式,為了不須要每次都又一次getViewByID。來獲取對象引用。
簡單來說,就是用起來比較方便罷了。事實上你也沒必要要用這東西。每次都從convertView中又一次獲取也不是不行,就是浪費代碼,浪費資源罷了。
然后說說getView反復調用問題。多數都是因為重繪導致的。一般來說。獎Item的寬度和高度設置成fill_parent,盡量不要用match。這樣會好非常多。
假設須要又一次繪制viewlist。能夠使用notifyDataSetChanged,主要是起到刷新界面的作用。
詳細參考鏈接:http://www.cnblogs.com/kissazi2/p/3721941.html
嘛,最后吐槽一下,感覺安卓非常多控件設計的耦合性好高。並且即使想要自行分離變量,也非常困難。
作者想要寫一個通用的Adapter,吧GetView里面的可變因素抽象,開放出來,結果發現,真這樣實現了導致好多接口對象的產生,感覺還不如一個頁面一個Adapter來實現的方便,所以就不在這里獻丑了。這也側面說明了,為什么安卓沒有比較通用成熟的一些好的高速開發框架的原因。