day58_实战项目智慧北京第04天
01_listview刷新头和尾的布局
listview构造函数
02_listview头和尾的加载
三个构造函数,将初始化信息写在参数最多的一个(最后被调用的),要去掉除最里面以外的super
加载头部和尾部的数据
refresh的addLunboView()
TPI.java里面的调用
03_隐藏listview的头和尾
设置头和尾的padding高度为负数
04_listview onTouch事件三种状态的处理
/ *
* (non-Javadoc)
*
* @see android.widget.AbsListView#onTouchEvent(android.view.MotionEvent)
* 覆盖此完成自己的事件处理
*/
@Override
publicboolean onTouchEvent(MotionEvent ev) {
// 需要我们的功能屏蔽掉父类的touch事件
// 下拉拖动(当listview显示第一个条数据)
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:// 按下
downY = ev.getY();// 按下时y轴坐标
break;
case MotionEvent.ACTION_MOVE:// 移动
if (!isLunboFullShow()) {
// 轮播图没有完全显示
break;
}
if (downY == -1) { // 按下的时候没有获取坐标
downY = ev.getY();
}
// 获取移动位置的坐标
float moveY = ev.getY();
// 移动的位置间距
float dy = moveY - downY;
// System.out.println("dy:" + dy);
// 下拉拖动(当listview显示第一个条数据)处理自己的事件,不让listview原生的拖动事件生效
if (dy > 0 && getFirstVisiblePosition() == 0) {
// 当前padding top 的参数值
float scrollYDis = -ll_refresh_head_root_Height + dy;
if (scrollYDis < 0 && currentState != PULL_DOWN) {
// 刷新头没有完全显示
// 下拉刷新的状态
currentState = PULL_DOWN;// 目的只执行一次
refreshState();
} elseif (scrollYDis >= 0 && currentState != RELEASE_STATE) {
currentState = RELEASE_STATE;// 记录松开刷新,只进了一次
refreshState();
}
ll_refresh_head_root.setPadding(0, (int) scrollYDis, 0, 0);
returntrue;
}
break;
case MotionEvent.ACTION_UP:// 松开
downY = -1;
//判断状态
//如果是PULL_DOWN状态,松开恢复原状
if (currentState == PULL_DOWN) {
ll_refresh_head_root.setPadding(0, -ll_refresh_head_root_Height, 0,
0);
} elseif (currentState == RELEASE_STATE) {
//刷新数据
ll_refresh_head_root.setPadding(0, 0, 0,
0);
currentState = REFRESHING;//改变状态为正在刷新数据的状态
refreshState();//刷新界面
//真的刷新数据
if (listener != null) {
listener.refresdData();
}
}
break;
default:
break;
}
returnsuper.onTouchEvent(ev);
}
05_刷新状态的切换动画
刷新界面方法
设置动画
06_松开状态的处理
07_刷新数据处理和listview界面状态的刷新
定义一个接口,用于TPI调用refreshLV中方法
TPI中实现接口方法
LV中
08_加载更多数据
刷新完成后,还原当前状态位pull_down
listview滚动监听
新增加"加载更多接口"
09_加载更多数据bug修复
上面
10_三种基本排序算法(暂时不学习)