思路大体如下:
1 自定义view,继承自listview,实现OnScrollListener接口。
2 初始化数据init(); 目的主要是:
(1)加载headerView 和footerView。其中,headerView的添加,需要先计算并获取布局的高度。设置其paddingTop的值后重绘,最后addheaderView()。
footerView稍微简单点,直接addfooterView即可。
(2)设置onscrollListener监听,用于监听onscroll状态,以便判断需要下拉刷新还是上拉加载。
3 重写onTouchEvent()事件,用于下拉刷新。大体思路如下:
先记录按下去的y坐标值。监听ACTION_MOVE,手势向下滑动,通过不断修改setpadding(0,top,0,0)中的top值,不断将headerview显示出来。当触发ACTION_UP事件,状态改为正在刷新状态。同时触发监听中的onRefresh()事件。
4stateChange()用于根据不同的状态显示不同的UI。
private static final int STATE_NONE = -1;// 无状态
private static final int STATE_NORMAL = 0;// 默认状态
private static final int STATE_REFRESHING = 1;// 正在刷新
private static final int STATE_WAITING_REFRESH = 2;// 松开刷新
private static final int STATE_NO_LOADMORE = 3;// 没有更多数据了
private static final int STATE_LOADING = 4;// 正在加载
private static final int STATE_NORMAL = 0;// 默认状态
private static final int STATE_REFRESHING = 1;// 正在刷新
private static final int STATE_WAITING_REFRESH = 2;// 松开刷新
private static final int STATE_NO_LOADMORE = 3;// 没有更多数据了
private static final int STATE_LOADING = 4;// 正在加载
5 完成刷新或加载更多,都需要调用onRefreshComplete(),目的是重置view的状态。
6 如果加载更多全部完成,可以调用onLoadMoreComplete(),用于显示没有更多数据了。
由于本人将onRefreshComplete()用于刷新和加载更多的状态重置,所以添加了neverLoadMore标识,目的是重新刷新数据后支持加载更多。
后期如果发现有什么bug,我会陆续修改。
附上demo
http://yun.baidu.com/share/link?shareid=4091291889&uk=2115601722