android 下拉刷新listview
知识点
控件的方法
addHeaderView()
这个方法必须在setAdapter()
方法之前调用。在隐藏控件的时候,除了可以使用
invisiblei()
之外,将控件的paddingTop()设置为控件高度的负值也可以隐藏getHeight() 和 getMeasuredHeight() 两个获取控件高度的区别
getMeasuredHeight() : 获取测量完的高度,只要
onMeasure()
方法执行完,就可以获得它的宽高。在自定义控件中多使用该方法获得控件宽高。注意:要在
view.measure(0,0)
方法后使用,使用
view.measure(0,0)`方法可以通知系统去测量其宽高,参数为0,0getHeight() : 必须在
onLayout()
方法执行完之后,才能获得宽高1
2
3
4
5
6
7
8view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
headerView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
// 获得其宽高
int headerViewHeight = headerView.getHeight();
}
});
在listview中,有
getFirstVisiblePosition()
,getLastVisiblePosition()
,getCount()
,setSelection()
(将对应的item放到屏幕顶端)等等好用的方法
数据查询
分页加载数据, mysql: select * from TABLE limit (index - 1), count
index : 当前页 , count : 每页显示的总数
接口
当定义一个功能,自己不实现,需要别人实现,并且可能每个人实现的方式不同,这时就需要定义接口,只提供方法的定义,不提供方法的实现。
在该案例中,需要定义一个
onRefreshListener()
接口, 不需要listview自己去实现,而是需要调用者去实现
1 | public interface OnRefreshListener { |
思路
- 下拉刷新,上拉加载
需要两个布局文件view
headerView
- 旋转加载的小圆圈 : 定义一个rotate的动画文件
footerView :
- 复用上面的小圆圈
初始化
headerView : 找到所有的控件 iv_rotate, iv_arrow, tv_state, tv_time
footerView : 初始化布局即可
animation : 初始化动画,在headerview中,iv_arrow需要用到rotate动画, 角度分别为
0-180
,180-360
setOnScrollListener : 滑动监听,上拉加载更多时需要用到。(下拉刷新,用onTouchEvent()事件)
逻辑处理
在onTouchEvent()方法中处理 :下拉刷新
在onScrollStateChanged()中处理 :上拉加载
逻辑处理中的判断
headerView 三种状态的判断
下拉刷新 -> 松开刷新 -> 正在刷新
待业务处理完(下拉刷新、上拉加载完成)后,记得恢复到初始状态