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;
}