編輯:關於Android編程
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,主要是起到刷新界面的作用。
嘛,最後吐槽一下,感覺安卓很多控件設計的耦合性好高,而且即使想要自行分離變量,也非常困難。
作者想要寫一個通用的Adapter,吧GetView裡面的可變因素抽象,開放出來,結果發現,真這樣實現了導致好多接口對象的產生,感覺還不如一個頁面一個Adapter來實現的方便,所以就不在這裡獻丑了。這也側面說明了,為什麼安卓沒有比較通用成熟的一些好的快速開發框架的原因。
我不知道大家有沒有這樣問題,項目做多了,就容易忽略最最基礎的知識,其實我也是在最近發現了自己也存在這樣的問題。因此打算做一些最基礎的知識的調研來重新學習和回顧這些容易被忽
大家使用Android的原生UI都知道,Android的Activity跳轉就是很生硬的切換界面。其實Android的Activity跳轉可以設置各種動畫。下面給大家看看
狀態模式說明“狀態模式允許一個對象在其內部狀態改變的時候改變其行為。這個對象看上去就像是改變了它的類一樣。” –《JAVA與模式》管理
推薦閱讀:Android使用ViewDragHelper實現仿QQ6.0側滑界面(一)但是之前的實現,只是簡單的可以顯示和隱藏左側的菜單,但是特別生硬,而且沒