安卓聊天頁面Listview加載多種布局實例解析

這幾天在做一個聊天功能,由于兩人對話的那個聊天頁面有七種布局,寫起來很繁瑣,特地總結(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 一個 出來 這樣就提高了效率。


希望這篇文章幫助到了您。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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