天天看点

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

继续阅读