天天看點

ANDROID中LISTVIEW仿QQ群組向上滾動特效

手機qq上有這樣一個特效:目前分組的好友,向上滾動時,在頂部會出現一個透明的框,當下一個分組到達時,會把上一個分組慢慢頂上去,覺得這個特效蠻有意思,就研究了一下,android自帶的通訊錄分組就有這個特效,這裡是自己仿寫的一個,部分源碼從通訊錄中扣出來的

實作原理:

前提條件,假設所有的資料已經分好組

1.listview中每一個item都預設有一個分組标簽,但是隻顯示此分組下面的第一個,其他的預設不顯示

2.滾動的時候,判斷每一個分組的狀态,是向上滾動,還是完全顯示,或者隐藏,主要是取目前item所在的分組跟(下一個分組-1=目前分組)相比,如果相等,說明是向上流動,否則是隐藏

3.擷取目前分組的狀态後,就可以放置分組的位置了,這裡使用view.layout(int left,int top,int rigth,int bottom) ,其他left是0,right是分組标簽的長度,top和bottom是需要計算的,用viewgroup.getchileat(0)擷取listview中第一個孩子的view,然後用bottom=view.getbottom擷取底部距離父視窗的位置,最後得到兩者之差y=bottom-标題框的高度,用這個差就可以得出頂部和底部的位置,就是top和bottom的值。

關鍵類解析:

pinnedheaderlistview.java 這個是實作listview分組的關鍵,當然布局檔案中的listview也要使用這個類,裡面有個接口,adapter要實作此接口,是滾動時回調用,其中getpinnedheaderstate()是用來分組标簽狀态的,

它的3種狀态都在此接口中定義,configurepinnedheader()是用來設定分組标簽的标題,也是相當于qq群組中的組名,此類中的configheaderview()就是放置分組使用的,結合上面的分析跟這個方法研究這個類

mysectionindexer.java類,主要是用來提供分組的資料的,主要包括,string[] msections-->所有的組名,int[] mpositions-->每一個組名在listivew中的位置,當然,他們的長度應該是相同的。

?

  當然,adapter也灰常重要,這裡簡單分析下,因為具體使用時,會根據情況使用不同的adapter,比如說,有資料庫的,可以使用simplecursoradapter,也可以使用simpleadapter等等,這裡使用的原始的listadapter,比較麻煩,這裡要實作上面提到的pinnedheaderadapter,還要實作sectionindexer,主要是用來根據實際位置查找分組的索引,以及根據索引傳回組名在實際listview中的位置(這裡有點不太好講,不太懂的,仔細看源碼和api)

其他的就是一些adapter的基本應用以及一些android 的基本知識,這裡不在講述,不懂的請提問。

源碼下載下傳位址:http://files.cnblogs.com/xiaoqlu/demosectionlistview_plus.rar

繼續閱讀