Adapter

android.jobbole.com/80766/

ListView是一個(gè)非常常用的控件菩彬,功能可以擴(kuò)展的很豐富针姿,而且與GridView有很多相似的地方。都可以存放大量數(shù)據(jù)蒙幻。而且當(dāng)我們需要比較復(fù)雜的布局時(shí),一般用SimpleAdapter,或者繼承BaseAdapter自己重寫殿雪。

如果是繼承ArrayAdapter,SimpleAdapter的時(shí)候,由于父類本身維護(hù)了一個(gè)List锋爪,所以當(dāng)有數(shù)據(jù)更新的時(shí)候丙曙,盡量用adapter的add,這樣可以保證getCount()返回的值是正確其骄。

這里面涉及到的一個(gè)比較重要的重寫函數(shù)就是getView

在getView中有三種方式實(shí)現(xiàn)view的返回亏镰。

第一種方式:

最簡單也是最容易理解的是每一個(gè)view都通過inflate生成一個(gè)新的view進(jìn)行返回

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

LayoutInflater inflater = LayoutInflater.from(context);

View item = inflater.inflate(R.layout.list_item_icon_text, null);

((TextView) item.findViewById(R.id.text)).setText(DATA[position]);

((ImageView) item.findViewById(R.id.icon)).setImageBitmap(

return item;

}

這種方式,在數(shù)據(jù)量小的時(shí)候拯爽,劣勢不明顯索抓,但是當(dāng)一個(gè)listview里面有大量條目時(shí),這種方式就顯得非常浪費(fèi)毯炮。因?yàn)槊恳淮蝘tem的出現(xiàn)逼肯,消失或者更新時(shí),都需要重新inflate桃煎。給內(nèi)存造成了很大的消耗篮幢。

那么還有什么方式可以節(jié)省開銷呢?

第二種方式:

我們看看getView函數(shù)里面conertview的是干啥的为迈。查看官方文檔后發(fā)現(xiàn):

convertView - The old view to reuse, if possible. Note: You should check that this view is non-null and of an appropriate type before using. If it is not possible to convert this view to display the correct data, this method can create a new view. Heterogeneous lists can specify their number of view types, so that this View is always of the right type (see Adapter.getViewTypeCount() and Adapter.getItemViewType(int)).

注:

getViewTypeCount()是用來當(dāng)listview中有不同的種類的item三椿,比如分割線之類的時(shí)候,用getItemViewType返回某個(gè)item的類型葫辐,然后坐不同的

原來converView是用來重用view的赋续。經(jīng)過查找別的資料。找到了一張比較經(jīng)典的圖如下:

這張圖清楚的描述了listview是如何重用view的另患。listview通過getview分別請求所有可見項(xiàng)目纽乱。此時(shí)converview是空的。

當(dāng)item1滑動出屏幕后昆箕,item8從下面滑動出來鸦列,此時(shí)又要調(diào)用getview,但是此時(shí)的converview已經(jīng)不再為空了鹏倘,而是上次一劃出屏幕的item1薯嗤,此時(shí)我們只需要重新修改下item1的數(shù)據(jù),而不必重新創(chuàng)建一個(gè)新的view纤泵。

這樣就節(jié)省了內(nèi)存骆姐。

那么由此我們得到了第二種方式

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

if (convertView == null) {

convertView = mInflater.inflate(R.layout.item, parent, false);

}

((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);

((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap(

(position & 1) == 1 ? mIcon1 : mIcon2);

return convertView;

}

這種方式里面镜粤,我們通過converview找到對應(yīng)需要修改的text和ico,然后修改數(shù)據(jù)玻褪,進(jìn)行返回肉渴。

有人會說,上面不已經(jīng)解決了重用的問題了么带射,還有第三種方式同规?

第三種方式:google推薦

static class ViewHolder {

TextView text;

ImageView icon;

}

這里定義了一個(gè)內(nèi)部靜態(tài)類,

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

ViewHolder holder;

if (convertView == null) {

convertView = mInflater.inflate(R.layout.list_item_icon_text,

parent, false);

holder = new ViewHolder();

holder.text = (TextView) convertView.findViewById(R.id.text);

holder.icon = (ImageView) convertView.findViewById(R.id.icon);

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

holder.text.setText(DATA[position]);

holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);

return convertView;

}

然后用convertView.setTag(holder)的方式將之前通過findViewById找到的textview與ImageView放入converivew對象中窟社。

這樣當(dāng)再次重用converview的時(shí)候券勺,就不必再次利用findViewById來查找了,省掉了開銷灿里。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末关炼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子匣吊,更是在濱河造成了極大的恐慌儒拂,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缀去,死亡現(xiàn)場離奇詭異侣灶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缕碎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門褥影,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咏雌,你說我怎么就攤上這事凡怎。” “怎么了赊抖?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵统倒,是天一觀的道長。 經(jīng)常有香客問我氛雪,道長房匆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任报亩,我火速辦了婚禮浴鸿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弦追。我一直安慰自己岳链,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布劲件。 她就那樣靜靜地躺著掸哑,像睡著了一般约急。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苗分,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天厌蔽,我揣著相機(jī)與錄音,去河邊找鬼俭嘁。 笑死躺枕,一個(gè)胖子當(dāng)著我的面吹牛服猪,可吹牛的內(nèi)容都是我干的供填。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼罢猪,長吁一口氣:“原來是場噩夢啊……” “哼近她!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起膳帕,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤粘捎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后危彩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攒磨,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年汤徽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娩缰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谒府,死狀恐怖拼坎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情完疫,我是刑警寧澤泰鸡,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站壳鹤,受9級特大地震影響盛龄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芳誓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一余舶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兆沙,春花似錦欧芽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憎妙。三九已至,卻和暖如春曲楚,著一層夾襖步出監(jiān)牢的瞬間厘唾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工龙誊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抚垃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓趟大,卻偏偏與公主長得像鹤树,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子逊朽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容