getView的原理



public View getView(int position, View convertView, ViewGroup parent) 

ListView控件中的viewitem數目只能剛好充滿屏幕,翻頁的過程中它只是用舊的view顯示新的數據 ,所以 convertView參數 有可能是null 有可能不是null .

[1]ListView asks adapter “give me a view” (getView) for each item of the list.(通過getView來獲取每個item)

[2]A new View is returned and displayed(獲取到後返回顯示)

那麼如果我們有大量的數據需要顯示的時候,每個Item都去重複執行getView中的創建新的View的動作嗎?這樣做會耗費大量的資源去執行重複的事情,實際上Android爲我們提供了一套重複利用的機制叫做Recycler”:

原理簡單描述下就是這樣:

在一個完整的ListView第一次出現時,每個Item都是Null的,getView的時候會跑到需要inflate一個Item的代碼段,假設整個view只能最多顯示10個item,那麼當滑動到第11個Item的時候,第一個item會放入“recycler”,如果第11個Item和放入“Recycler”的item的view一致,那麼就會使用"Recycler"裏面的Item來顯示,從而不用再重複inflate一次,這樣大大節省了創建View的工作,在需要顯示大量數據時顯得尤爲重要。

工作原理的示意圖如下:

等所有的item,一共10個都顯示之後,不管上下滑動都再也不是NULL了,說明這個時候都是使用Recycle裏面的view,而不會再重新inflate了,顯然這樣節省很多重複的操作。

例如在一下代碼中:

convertView有時爲空,有時不爲空,返回的<pre name="code" class="java" style="color: rgb(51, 51, 51); font-size: 14px; font-weight: bold; line-height: 26px;">convertView爲其中一項的佈局;

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		if (convertView == null) {
			convertView = LayoutInflater.from(context).inflate(R.layout.gallery1_item,
					null);
		}
		ImageView img = (ImageView) convertView.findViewById(R.id.home_img);
		img.setImageResource(res[position]);
		return convertView;
	}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章