最近才有时间将上拉加载与下拉刷新进行总结,SwipeRefreshLayout是Android -V4包下自带的一个刷新控件,但是不足的是它只有下拉刷新的功能,没有需要的上拉加载功能,所以我自己添加了上拉加载的功能。
一、首先简单介绍一下SwipeRefreshLayout的。
这个是我在网上找的一个官网的介绍,在竖直滑动时想要刷新页面可以用SwipeRefreshLayout来实现。其实它也就是我们在使用列表的时候需要的上拉加载与下拉刷新的实现,它通过设置OnRefreshListener来监听界面的滑动从而实现刷新。也可以通过一些方法来设置SwipeRefreshLayout是否可以刷新。如:setRefreshing(true),展开刷新动画;setRefreshing(false),取消刷新动画;setEnable(true)下拉刷新将不可用。注意的是,它只可以有一个子控件,一般使用的是ListView。
常用到的方法有以下几个:
-
isRefreshing()
- 判断当前的状态是否是刷新状态。
-
setColorSchemeResources(int... colorResIds)
- 设置下拉进度条的颜色主题,参数为可变参数,并且是资源id,可以设置多种不同的颜色,每转一圈就显示一种颜色。
-
setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener listener)
- 设置监听,需要重写onRefresh()方法,顶部下拉时会调用这个方法,在里面实现请求数据的逻辑,设置下拉进度条消失等等。
-
setProgressBackgroundColorSchemeResource(int colorRes)
- 设置下拉进度条的背景颜色,默认白色。
-
setRefreshing(boolean refreshing)
- 设置刷新状态,true表示正在刷新,false表示取消刷新。
1、首先我们写一个类RefreshView继承自SwipeRefreshLayout,在它的onLayout方法中获取ListView布局,如下:
// 获取ListView,设置ListView的布局位置 if (mListView == null) { // 判断容器有多少个孩子 if (getChildCount() > 0) { // 判断第一个孩子是不是ListView if (getChildAt(0) instanceof ListView) { // 创建ListView对象 mListView = (ListView) getChildAt(0); // 设置ListView的滑动监听 setListViewOnScroll(); } } }
2、在复写的代码下添加如下代码,获取底部加载的布局
// 填充底部加载布局 mFooterView = View.inflate(context, R.layout.view_foot, null); // 表示控件移动的最小距离,手移动的距离大于这个距离才能拖动控件 mScaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); System.out.println("====" + mScaledTouchSlop);
3、需要判断上拉与下拉。所以需要设置ListView的滑动
/** * 设置ListView的滑动监听 */ private void setListViewOnScroll() { mListView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // 移动过程中判断时候能下拉加载更多 if (canLoadMore()) { // 加载数据 loadData(); } } @Override