Android之ListView(二) -- 基本(BaseAdapter、點(diǎn)擊事件)

續(xù)接上篇ArrayAdapter和SimpleAdapter。

3、BaseAdapter和ListView的優(yōu)化

這種方式是通過繼承BaseAdapter自定義Adapter的方式實(shí)現(xiàn),適用性也是最強(qiáng)的。

自定義Adapter使用方法:

1、首先布局文件中添加ListView控件(已經(jīng)說過)

2、定義ListView中每一項(xiàng)的view布局文件,同SimpleAdapter方式中的定義

3、創(chuàng)建一個(gè)自定義Adapter類,該類繼承自BaseAdapter,因BaseAdapter是一個(gè)抽象類,所以繼承它必須實(shí)現(xiàn)它的方法。

4、activity的java代碼中為listview設(shè)置Adapter

自定義Adapter類的定義

上圖中為要實(shí)現(xiàn)的方法。

1、構(gòu)造方法:

參數(shù)1:可以將當(dāng)前上下文作為參數(shù)傳入,當(dāng)前上下文必須傳入,因?yàn)橐鶕?jù)當(dāng)前上下文導(dǎo)入布局對(duì)象;

參數(shù)2:要綁定的數(shù)據(jù),因?yàn)槔L制每一行的時(shí)候要同時(shí)為每個(gè)控件設(shè)置對(duì)應(yīng)的數(shù)據(jù)。

2、getcount:獲取數(shù)組的長(zhǎng)度,也即listview的item數(shù);

3、getitem:獲取每一項(xiàng)的數(shù)據(jù)對(duì)象;

4、getItemId:獲取每一項(xiàng)的數(shù)據(jù)對(duì)象的id

5、getview:該方法在listview的每個(gè)子項(xiàng)被滾動(dòng)到屏幕內(nèi)的時(shí)候被調(diào)用。該方法設(shè)置子項(xiàng)的每個(gè)控件對(duì)應(yīng)的數(shù)據(jù),定義每個(gè)子項(xiàng)中的控件的點(diǎn)擊、選擇等事件的處理方法,均在該方法中設(shè)置,最后返回設(shè)置好的每一項(xiàng)的view。

getview參數(shù):public View getView(int position, View convertView, ViewGroup parent)

參數(shù)1 ?int position:當(dāng)前項(xiàng)的位置

參數(shù)2 View convertView:用于將之前加載好的布局進(jìn)行緩存,如果不為null,則說明之前已經(jīng)加載過,該參數(shù)中值為之前緩存的布局。convertView是listview的子項(xiàng)布局文件中最外面的一個(gè)layout。

參數(shù)3 ViewGroup parent:當(dāng)前view的上層view,在一些情況下會(huì)使用到,例如,從父view中移除當(dāng)前項(xiàng)。

下面展示一段沒有優(yōu)化過的getview的代碼實(shí)現(xiàn),該方法為listview的每個(gè)子項(xiàng)的中的每個(gè)控件綁定數(shù)據(jù)。

未經(jīng)優(yōu)化的實(shí)現(xiàn)代碼

以上代碼會(huì)在listview繪制每一個(gè)子項(xiàng)的時(shí)候調(diào)用,可以實(shí)現(xiàn)功能。但是會(huì)有效率問題,當(dāng)我們滾動(dòng)屏幕時(shí),每顯示一個(gè)子項(xiàng)都要調(diào)用一次,也就意味著每次都會(huì)加載布局,加載布局是一個(gè)耗時(shí)的操作,當(dāng)快速滾動(dòng)且子項(xiàng)較多時(shí)便會(huì)成為性能瓶頸。

優(yōu)化過的代碼

優(yōu)化過的代碼使用了convertView,對(duì)convertView進(jìn)行了判斷,如果為空才去加載布局,否則直接重用。同時(shí)增加了ViewHolder,ViewHolder是對(duì)子項(xiàng)的控件進(jìn)行了緩存,這樣避免了每次都通過findViewById方法去獲取控件實(shí)例。

二、ListView,處理用戶的點(diǎn)擊事件

事件處理的定義,有兩種方式,一種是可以通過listview的setOnItemClickListener實(shí)現(xiàn),一種通過重Adapter時(shí)定義。前一種是只要點(diǎn)擊子項(xiàng)就會(huì)觸發(fā),后一種可以設(shè)置為點(diǎn)擊子項(xiàng)中的某一個(gè)控件才觸發(fā),后者更強(qiáng)大一些。

1、setOnItemClickListener:

setOnItemClickListener

2、在自定義Adapter中定義某一個(gè)控件的點(diǎn)擊事件

在自定義adapter中定義R.id.more控件的點(diǎn)擊事件

其他事件定義同點(diǎn)擊事件。



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容