一深寥、適配器(BaseAdapter)優(yōu)化
昨天我們一起用ListView實現(xiàn)了一個QQ列表惋鹅,大家記得我們用的適配器(BaseAdapter)嗎殉簸?今天我們來講一下關(guān)于適配器的優(yōu)化般卑。
我覺得讓大家印象最深的應該就是 重寫他的getVIew方法了吧蝠检。沒錯,在適配器中優(yōu)化也主要是對他的getView方法進行優(yōu)化叹谁。在上面我們注意到我們每次進入getView的時候,首先都會獲取視圖(inflate)焰檩,然后通過findViewById分別找到視圖中的每一個控件析苫,然后對他們進行數(shù)據(jù)操作。
這個邏輯大家應該都已經(jīng)屢清楚了吧衩侥。但是實際上這樣做是非常消耗內(nèi)存的顿乒,我們現(xiàn)在只有很少的數(shù)據(jù)量泽谨,如果我們要做的是那種list的item非常多的項目,那么他對內(nèi)存的消耗是巨大的涂身。你想一下搓蚪,不管是已經(jīng)加載過的妒潭,還是沒有加載過的,都要重新加載他的視圖漠酿,然后在進行數(shù)據(jù)操作谎亩。
有沒有一種方法匈庭,可以讓我們把已經(jīng)加載過的視圖儲存起來,等二次加載時直接調(diào)用呢夭拌?這就是我們今天要講的優(yōu)化方案:
我們首先創(chuàng)建了一歌名為ViewHolder的類啼止,顧名思義兵罢,他是一個View的持有者,我們每次加載過的View都可以儲存進這個Viewholder里面巩那。
接下來我們在getView中創(chuàng)建一個Viewholder即横。
下面這段信息量可能有點大裆赵,我們慢慢看一下:
首先我們進入getView方法時战授,先創(chuàng)建了一個局部對象Viewholder的引用桨嫁;
然后就是判斷convertView是不是為空璃吧。因為如果是首次加載的item废境,他的視圖噩凹,也就是這個convertView是空的,所以在對于首次加載务冕,我們跟優(yōu)化前沒什么兩樣幻赚,只是實例化了holder落恼;然后給holder的四個屬性分別賦值。
大家注意一下為什么Viewholder類里面有四個屬性戴涝,因為我們需要加載的視圖中就有四個控件(我這個項目中有4個控件)钻蔑,我們Viewholder的目的就是為了存放已經(jīng)加載過的數(shù)據(jù)咪笑,所以是四個。
最后我們調(diào)用了View的settag方法映跟。把我們holder的值存入了當前這個布局中扬虚。
那么else寫起來就更簡單了辜昵,else對應的是如果已經(jīng)是加載過的布局,那么我們只需要從convertView中找到我們存入的Viewholder贷洲,然后在進行數(shù)據(jù)賦值就好。
這樣雁竞,我們適配器的優(yōu)化就完成了。
二彪腔、ListView的條目點擊事件
我們的ListView中有很多的Item进栽,我們肯定是需要點擊的快毛,那么他的點擊事件該怎么寫呢?
我們切換到我們的Activity界面唠帝。
注意了屯掖,這里不是setOnCLickListener,而是SetOnItemClickListener襟衰。
在onItemClick里面贴铜,就是我們點擊了條目以后執(zhí)行的操作了,我們在里面吐司一下瀑晒。
很簡單绍坝,不需要我在說什么了吧,我們來看一下效果苔悦。
他除了條目點擊事件轩褐,還有一個條目的長按事件:
我們注意到這個方法是有返回值的,返回的是一個boolean的類型间坐,我來說一下:
當他返回false時,在長按后執(zhí)行了ItemLongCLick方法之后竹宋,還會繼續(xù)執(zhí)行ItemClick方法劳澄。
當返回true是,在長按后執(zhí)行了itemLongClick方法之后蜈七,不會繼續(xù)執(zhí)行itemClick方法秒拔。
效果和代碼都在上面了,很簡單飒硅,相信大家都能看懂砂缩。
下面我來說一下這兩個方法的參數(shù):
parent:這個參數(shù)我們用的很少作谚,暫時不談。
view:這個view就是我們在getView中的convertView庵芭,也就是我們獲取到的視圖妹懒。
position和id:這兩個參數(shù)大多數(shù)情況下很像,我們一般只用position双吆。