1 最终效果展示
2 代码实现思路
(1)自定义控件继承Listview
(2)添加头布局
(3)添加脚布局
(4)设置触摸监听事件
(5)设置滑动监听事件
3 需要get的部分
(1)如何通过不同的触摸(DOWN,MOVE,UP)状态,改变头布局的状态,包括加载更多的进度条、箭头动画、时间的变化。(脚部相同)
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
downY = ev.getY();//下拉的位置
break;
case MotionEvent.ACTION_MOVE:
moveY = ev.getY();//移动的位移
float offset = moveY - downY; // 移动的偏移量
// 只有 偏移量>0, 并且当前第一个可见条目索引是0, 才放大头部
if(offset > 0 && getFirstVisiblePosition() == 0){
int paddingTop = (int) (- mHeaderViewHeight + offset);//整个是负值,往出拉多少,就将负值减少多少
mHeaderView.setPadding(0, paddingTop, 0, 0);
if(paddingTop >= 0 && currentState != RELEASE_REFRESH){// 头布局完全显示
// 切换成释放刷新模式
currentState = RELEASE_REFRESH;
updateHeader(); // 根据最新的状态值更新头布局内容
}else if(paddingTop < 0 && currentState != PULL_TO_REFRESH){ // 头布局不完全显示
// 切换成下拉刷新模式
currentState = PULL_TO_REFRESH;
updateHeader(); // 根据最新的状态值更新头布局内容
}
return true; // 当前事件被我们处理并消费
}
break;
case MotionEvent.ACTION_UP:
// 根据刚刚设置状态
if(currentState == PULL_TO_REFRESH){
//- paddingTop < 0 不完全显示, 恢复
mHeaderView.setPadding(0, -mHeaderViewHeight, 0, 0);
}else if(currentState == RELEASE_REFRESH){
//- paddingTop >= 0 完全显示, 执行正在刷新...
mHeaderView.setPadding(0, 0, 0, 0);
currentState = REFRESHING;
updateHeader();
}
break;
default:
break;
}
return super.onTouchEvent(ev);
}
(2)当下拉刷新和上拉加载更多之后,数据的获取以及更新。
在View中设置监听接口
public interface OnRefreshListener{
void onRefresh();
void onLoadMore();
}
public void setRefreshListener(OnRefreshListener mListener){
this.mListener = mListener;
}
在Activity中使用监听接口,监听状态
list_view.setRefreshListener(new RefreshListView.OnRefreshListener() {
@Override
public void onRefresh() {
new Thread(){
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
listDatas.add(0,"下拉刷新出来的数据");
runOnUiThread(new Runnable() {
@Override
public void run() {
refreshAdapter.notifyDataSetChanged();//刷新数据
list_view.onRefreshcomplete();
}
});
}
}.start();
}
@Override
public void onLoadMore() {
new Thread(){
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
listDatas.add("加载更多");
runOnUiThread(new Runnable() {
@Override
public void run() {
refreshAdapter.notifyDataSetChanged();
list_view.onRefreshcomplete();
}
});
}
}.start();
}
});