SwipeRefreshLayout官方提供的下拉刷新功能实现:
xml代码:
<android.support.v4.widget.SwipeRefreshLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/swipe">
<ListView
android:id="@+id/homePage_lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="3dp"></ListView>
</android.support.v4.widget.SwipeRefreshLayout>
Java代码:
swipe.setColorSchemeResources(R.color.colorPrimary,R.color.colorAccent,R.color.colorBottomBar);
swipe.setSaveEnabled(true);
swip.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
handler.sendEmptyMessageDelayed(0,3000);
}
});
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
list.clear();
//重新请求数据
initData();
//隐藏下拉刷新的view
swip.setRefreshing(false);
}
};
重写SwipeRefreshLayout,实现下拉刷新与上拉加载更多,分页加载
public class ReferenceLayout extends SwipeRefreshLayout implements AbsListView.OnScrollListener {
//加载更多监听
private OnLoadingListener listener;
//尾布局
private View footerView;
//是否在加载的过程中
private boolean isLoading = false;
private ListView lv;
//滑动到最底端时的上拉操作
private int mTouchSlop;
//按下时的Y坐标
private int mYDown;
//抬起时的Y坐标,和mYDown一同用于判断滑动到最底端时的上拉或下滑
private int mLastY;
public ReferenceLayout(Context context) {
super(context, null);
initFooterView(context);
}
public ReferenceLayout(Context context, AttributeSet attrs) {
super(context, attrs);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
initFooterView(context);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//判断是否可以加载更多
if (canLoad()) {
//加载更多
loadData();
}
}
//定义加载更多的接口
public interface OnLoadingListener {
public void onLoading();
}
public void setOnLoadingListener(OnLoadingListener listener) {
this.listener = listener;
}
//添加尾布局
private void initFooterView(Context context) {
footerView = LayoutInflater.from(context).inflate(R.layout.footer_layout, null, false);
}
//是否是加载中
public void setLoadingState(boolean state) {
isLoading = state;
//是加载中则添加尾布局,否则移除尾布局
if (state) {
lv.addFooterView(footerView);
} else {
lv.removeFooterView(footerView);
mLastY = 0;
mYDown = 0;
}
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
//如果ListView不为空时,则获取ListView对象并为其设置滚动监听
if (lv == null) {
int childCount = getChildCount();
if (childCount > 0) {
for (int i = 0; i < childCount; i++) {
View view = getChildAt(i);
if (view instanceof ListView) {
lv = (ListView) view;
lv.setOnScrollListener(this);
}
}
}
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
//按下,或许Y坐标
mYDown = (int) ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
//移动获取Y坐标
mLastY = (int) ev.getRawY();
break;
case MotionEvent.ACTION_UP:
//抬起,如果满足加载更多,则进行加载更多
if (canLoad()) {
loadData();
}
}
return super.dispatchTouchEvent(ev);
}
//是否可以加载更多,是否到达底部,并ListView不在加载中,执行上拉操作
private boolean canLoad() {
return isBottom() && !isLoading && isPullUp();
}
//判断是否滑到最底部
private boolean isBottom() {
if (lv != null && lv.getAdapter() != null) {
return lv.getLastVisiblePosition() == (lv.getAdapter().getCount() - 1);
}
return false;
}
//判断是否是上拉操作
private boolean isPullUp() {
return (mYDown - mLastY) >= mTouchSlop;
}
//如果是最底部,且为上拉操作,不在加载中,则加载更多
private void loadData() {
if (listener != null) {
setLoadingState(true);
listener.onLoading();
}
}
}
xml布局
<com.sq.gasdetection.utils.ReferenceLayout
android:id="@+id/show_swipe"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:layout_marginTop="5dp"
android:id="@+id/show_lv"
android:divider="@color/loginColor"
android:dividerHeight="1dp"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</com.sq.gasdetection.utils.ReferenceLayout>
Java代码
swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
//handler发送消息,延时3秒,进行刷新
handler.sendEmptyMessageDelayed(0,3000);
}
});
swipe.setOnLoadingListener(new ReferenceLayout.OnLoadingListener() {
@Override
public void onLoading() {
//handler发送消息,延时1秒,进行加载更多
handler.sendEmptyMessageDelayed(1,1000);
}
});
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
//清空集合
list.clear();
//重新加载数据
initData(0);
//刷新完成隐藏view
swipe.setRefreshing(false);
break;
case 1:
//增加页码
num++;
//加载数据
initData(num);
//设置不进行加载更多
swipe.setLoadingState(false);
break;
}
}
};