Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android BaseAdapter getView 理解

android BaseAdapter getView 理解

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

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved