废话少说,先上效果图:
(中间加上一个日期就行了,这可是我用画图软件,耗费了将近40秒画的,花了我很多精力的!所以请勿随便拿去用,起码得先点赞和评论嘛)。
声明:
接下来称那些特殊位置的item为sticky(粘性的),即左侧显示十字型背景的为sticky,显示两条竖线的为普通item。
例子:
有数据数组为:(15-03-01,A),(15-03-01,B),(15-03-02,C),(15-03-02,D),(15-03-02,E)
则位置0(15-03-01,A)和位置2(15-03-02,C)为sticky的,分别为日期15-03-01和15-03-02的起始item。
高清源码:
(1)自定义ListView
首先先自定义一个JJJListView继承ListView,写下构造方法什么的,没啥好说的。
(2)定义接口
JJJListView要把HeadView画出来,它得知道HeadView长怎么样,要画多大吧。所以定义一个接口给外部设置,JJJListView通过外部设置的接口获取HeadView的信息。
之前的看过的开源库是不要求外部传入HeadView的宽和高的,但那个开源库的HeadView是横向布满ListView的,我们不是,还是固定死宽高方便点。
(3)测量HeadView的大小
在ListView进行测量时,也对HeadView进行测量:
getHeadViewWidth()和getHeadViewHeight()只是简单的进行dp和px的转换,xml里我们一般会设置大小单位为dp在不同分辨率的手机上获得更好的效果,但是在代码设置中都是以px为单位的,这方面网上文章很多,讲的也很详细,我就不废话了。
(4)布局HeadView的位置
同上,在ListView的布局过程中对HeadView进行布局到左上角。
注意这里用的是getMeasuredWidth()而不是getWidth(),前面我们自己对HeadView进行过测量,所以getMeasuredWidth()是有值的,但是getWidth()在HeadView真正被绘制出来后才有值,高度同理。
(一个View的显示流程是:测量大小–>位置布局–>绘制)
(5)绘制HeadView
这个不用解释吧。
(6)HeadView内容的改变
经过上面的步骤,HeadView已经以确定的大小和位置被画在ListView上了。但是当ListView滚动时,要对HeadView的内容进行修改,以上面效果图的例子就是修改TextView显示的日期。
那么,首先,要知道HeadView在什么时候需要进行修改:
当ListView第一个可见的item为sticky时,需要对HeadView进行修改。
不知道为什么的请发动你们的大脑,仔细想一想。
在第一步初始化时我们已经设置了滚动监听了,现在我们在滚动时进行判断:
来源:while-living
声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!