android BaseAdapter getView 理解


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來實現的方便,所以就不在這里獻丑了。這也側面說明了,為什么安卓沒有比較通用成熟的一些好的高速開發框架的原因。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM