這幾天在做一個聊天功能,由于兩人對話的那個聊天頁面有七種布局,寫起來很繁瑣,特地總結(jié)一下,順便給大家講一下getview。
下面上代碼:
自定義適配器 繼承 BaseAdapter ?復寫 四個方法,大家很熟悉是吧 。通過構(gòu)造函數(shù)將數(shù)據(jù)源data 傳遞過來,此處定義的handler是用來拋出數(shù)據(jù)給 Activity 進行頁面刷新的。73 ?76 行后面會降到。
89-99 行略過,重點講解 101 開始:我們要加載多種布局必須重寫該方法。msg 為 獲取的數(shù)據(jù),Type 為后臺傳遞過來的類型,我們根絕類型去家在不同的布局。此時為什么要定義type=0呢,因為該方法的源碼 ?默認是從 0 開始的(很重要)也就是返回類型要從0開始。105 -122行 是自行定義的方法 用來判斷是登錄者發(fā)出的信息還是接受者發(fā)出的,這個也就是用來判斷加載左布局還是右布局,下面的 type=1,2,3,4,5,6,7。。是用來判斷加載幾種布局。我這個里面是加載7種布局,理論上來講聊天頁面左側(cè)發(fā)的純文字和右側(cè)的純文字可以寫成一種布局也可以寫成兩種布局,我寫成了一種,因為上面根絕105 行可以進行判斷是加載哪個布局。這里不再贅述。
135 行 返回的 是 加載幾種布局,因為我的是其中布局,你寫大于7的數(shù)子即可,記得 不能小于7 ?負責會造成數(shù)組越界異常。
我們都知道getview 是獲取 每一項的 listview 的 item控件進行繪制,安卓為我們提供了復用的一個機制,就是自己定義viewholder 來驚醒 布局的重新使用,負責一萬個數(shù)據(jù)你難道要畫上一萬個布局么,這個不現(xiàn)實。
開始加載布局的時候 ?我們根絕type ?去進行加載布局的viewholder,加載布局,綁定控件,為該布局設置tag,好為后面的復用打下基礎,這個type 一定要從 0 開始 ,上面提到過。系統(tǒng)規(guī)定的。
244 行開始 是用來復用 那七個布局的,這個 跟有一個布局的是一樣的。不再贅述。
這個是負責來寫一些所對應布局的業(yè)務邏輯和賦值,所有布局邏輯你想寫什么就寫什么。簡單吧。
最后記得 rentun ?converivew ,負責會崩潰。下面是定義的viewholder 沒什么可說的。
public class ViewHolderMsgLeft{
//頭像
publicImageViewimageViewPic;
//信息內(nèi)容
publicTextViewtextViewMsg;
//發(fā)消息時間
publicTextViewtextViewTime;
//圖片
publicImageViewimageViewChat;
}
public class ViewHolderMsgRight{
//頭像
publicImageViewimageViewPic;
//信息內(nèi)容
publicTextViewtextViewMsg;
//發(fā)消息時間
publicTextViewtextViewTime;
//圖片
publicImageViewimageViewChat;
}
總結(jié):復寫getItemViewType方法和getViewTypeCount方法,在getItemViewType方法里面進行布局的判斷加載,記得一定要從0 開始且不可以放在getview里面去判斷負責會出現(xiàn)布局錯亂的問題。getview方法里面記住要復用布局和主義效率。
下面分析下getview
一、ConvertView回收機制
工作原理:
1、ListView 針對List中每個item,要求 adapter “給我一個視圖” (getView)。
2、一個新的視圖被返回并顯示
如果你有10億個項目(item),其中只有可見的項目存在內(nèi)存中,其他的在Recycler(緩存視圖)中。
ListView先請求一個type1視圖(getView)然后請求其他可見的項目。convertView在getView中是空(null)的。
當item1滾出屏幕,并且一個新的項目從屏幕低端上來時,ListView再請求一個type1視圖。convertView此時不是空值了,它的值是item1。你只需設定新的數(shù)據(jù)然后返回convertView,不必重新創(chuàng)建一個視圖。?? 以上摘自《ListView中g(shù)etView的原理+如何在ListView中放置多個item》
舉例:lsitview在初始化時,整個屏幕能放下10個ITEM,所以會創(chuàng)建10個全新的convertView。當我往下拉一個ITEM,出現(xiàn)第11個ITEM的時候,第一個item布局看不到了,就會回收第一個ITEM的convertView給第11個,這就顯而易見了。每次運行g(shù)etView獲取當前ITEM時,都會重新new 一個viewHolder與R.layout.item綁定,也就是說,每次都會產(chǎn)生一個新布局賦值給convertView讓其顯示。而超出顯示范圍的item布局會被回收,我們不用重新new 一個 出來 這樣就提高了效率。
希望這篇文章幫助到了您。