SwipeRefreshLayout是Google的亲儿子,也就是原生的刷新,但是它只支持下拉刷新不支持上啦加载更多,今天小弟不才自己添加了一个上啦加载的方法希望给用到的人给予参考鉴赏,话不多说直接开启……
一、首先先来说下SwipeRefreshLayout的一个常用方法:
①、isRefreshing() 判断当前的状态是否是刷新状态。
②、setColorSchemeResources(int... colorResIds)设置下拉进度条的颜色主题。
③、setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener listener)设置监听,需要重写onRefresh()方法,顶部下拉时会调用这个方法,在里面实现你要实现的业务逻辑即可。
④、setProgressBackgroundColorSchemeResource(int colorRes)设置下拉进度条的背景颜色。
⑤、setRefreshing(boolean refreshing)设置刷新状态,true表示正在刷新,false表示取消刷新。 自动刷新
二、说完常用方法了,说下SwipeRefreshLayout的基本使用,其实SwipeRefreshLayout的使用非常简单,PS:
<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefresh" android:layout_width="match_parent" android:layout_height="wrap_content"> <ListView android:id="@+id/new_listView" android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="@color/gray" android:dividerHeight="1px"/> </android.support.v4.widget.SwipeRefreshLayout>官方文档已经说明SwipeRefreshLayout只能有一个孩子,所以使用的时候一定注意方式。
swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { //这里是主线程一些比较耗时的操作比如联网获取数据,需要放到子线程中去执行
//这里也可以直接请求
}});
这样就可以简单的实现下拉刷新了
三、我们来说下上啦加载更多的功能:
这里我们就得自定义上拉加载更多的布局了,定义一个view集成SwipeRefreshLayout从而实现上拉加载
我们在定义的RefreshListView中onLayout中先获取listview的控件
@Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); // 初始化ListView对象 if (mListView == null) { getListView(); } }
然后再获取listview的对象并且设置滚动监听
/** * 获取ListView对象 */ private void getListView() { int childs = getChildCount(); if (childs > 0) { View childView = getChildAt(0); if (childView instanceof ListView) { mListView = (ListView) childView; // 设置滚动监听器给ListView, 使得滚动的情况下也可以自动加载 mListView.setOnScrollListener(this); Log.d(VIEW_LOG_TAG, "### 找到listview"); } } }
接着再处理下事件分发
@Override public boolean dispatchTouchEvent(MotionEvent event) { final int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: // 按下 mYDown = (int) event.getRawY(); break; case MotionEvent.ACTION_MOVE: // 移动 mLastY = (int) event.getRawY(); break; case MotionEvent.ACTION_UP: // 抬起 if (canLoad()) { loadData(); } break; default: break; } return super.dispatchTouchEvent(event); }
最后就是进行判断从而实现它的加载数据了
/** * 是否可以加载更多, 条件是到了最底部, listview不在加载中, 且为上拉操作. * * @return */ private boolean canLoad() { return isBottom() && !isLoading && isPullUp(); } /** * 判断是否到了最底部 */ private boolean isBottom() { if (mListView != null && mListView.getAdapter() != null) { return mListView.getLastVisiblePosition() == (mListView.getAdapter().getCount() - 1); } return false; } /** * 是否是上拉操作 * * @return */ private boolean isPullUp() { return (mYDown - mLastY) >= mTouchSlop; } /** * 如果到了最底部,而且是上拉操作.那么执行onLoad方法 */ private void loadData() { if (mOnLoadListener != null) { // 设置状态 setLoading(true); // mOnLoadListener.onLoad(); } } /** * @param loading */ public void setLoading(boolean loading) { isLoading = loading; if (isLoading) { mListView.addFooterView(mListViewFooter); } else { mListView.removeFooterView(mListViewFooter); mYDown = 0; mLastY = 0; } }
!收尾,这里就是在布局中如何使用
<com.handmark.pulltorefresh.library.RefreshListView android:id="@+id/pt_listView" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@+id/new_listView" android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="@color/gray" android:dividerHeight="1px"/> </com.handmark.pulltorefresh.library.RefreshListView>
<!--自定义View实现SwipeRefreshLayout,添加上拉加载更多的功能--> <com.pinger.swiperefreshdemo.view.SwipeRefreshView android:id="@+id/srl" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent"/> </com.pinger.swiperefreshdemo.view.SwipeRefreshView>作者:PingerOne 链接:http://www.jianshu.com/p/d23b42b6360b 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
在代码中使用
// 设置下拉刷新监听器 refresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { refresh.post(new Runnable() { @Override public void run() { // 更新完后调用该方法结束刷新 refresh.setRefreshing(false); } }); } }); refresh.setOnLoadListener(this);
这是上拉加载更多
@Override public void onLoad() { refresh.postDelayed(new Runnable() { @Override public void run() { isLoad = true; if (number<6) { number++; for (int i = 0; i < 6; i++) { DepositAccount depositAccount = new DepositAccount(); depositAccount.setName("上拉加载704195"+number); depositAccount.setCount(2009.66); depositAccount.setTime("2017-4-20 09:00"); depositAccount.setEndTime("2017-05-20"); listDepositAccount.add(depositAccount); } }else{ textFooterView.setText("数据已加载完毕"); // listivew.removeFooterView(textFooterView); } depositAdapter.notifyDataSetChanged(); // 加载完后调用该方法 refresh.setLoading(false); } }, 1500);
总的来说这么多了,上班期间写的不好还望大家海涵,总体思路也就是这样了这里只供参考希望能给用到的人一些帮助。