此文系转载 源码:https://github.com/Maxwin-z/XListView-Android
这是接触Android开发后写的第二个控件。话说下拉刷新组件网上就有好多版本,但我找到的两个(其中一个是 johannilsson的,国内很多就翻译的这个版本),效果都不是特别满意,关键还有bug(不至于crash,但是用户体验不好)
XListView,为毛叫X,因为它提供了“下拉刷新”和“上拉载入更多”两个功能,不想取PullDownRefreshAndPullUpLoadListView这种名字。
说下原理和碰到的问题,具体细节请到github下源码。
0. XListView继承ListView。
1. 下拉刷新组件是ListView的一个Header。在ListView创建时就将这个自定义View塞进去,默认情况是看不到的,所以这个HeaderView的高度初始设置为0。
2. 上拉载入更多组件是Footer,为了确保这个footer在最后(可能会添加多个自定义footer),在用户调用setAdatper的时候再把这个footer塞进去。
3. 覆写ListView的onTouchEvent方法,处理各种情况。
4. 用户松手,启动mScroller,将header、footer回滚到所需状态。
5. 添加了用户下拉、上拉移动delay的效果,类似iOS的行为。
6. 提供了两个接口:
a) IXListViewListener: 触发下拉刷新、上拉载入更多
b) OnXScrollListener: 这个和原生的OnScrollListener一样,但是在mScroller回滚时,也会触发这里的事件。
碰到的问题:
1. 用户下拉回推时,不断修改header的高度,但这时候滚动条指示器的位置还是按老的高度计算的,需要强制调用一下setSelection(0)将ListView滚动到顶部。
贴几张效果图:
下拉刷新
![](https://img-my.csdn.net/uploads/201209/29/1348911872_8265.png)
![](https://img-my.csdn.net/uploads/201209/29/1348911878_5051.png)