您的位置:首页 > 其它

自定义SwipeRefreshLayout实现上拉加载更多并自带系统的下拉刷新

2017-06-06 16:37 525 查看
/**
* Created by lzy on 2017/6/6 0006.
*/

public class MySwipeRefreshLayout extends SwipeRefreshLayout{
private final TextView mFooterView;
ListView view;
OnListScrollListener listener;
boolean isLoading;//判断当前layout是否在加载中,防止异步操作导致加载中再重复加载
boolean isShowing;//判断底部加载栏是否需要显示
Context mContext;
public MySwipeRefreshLayout(Context context) {
super(context);
mContext = context;
mFooterView = new TextView(mContext);
mFooterView.setText("正在加载中");
mFooterView.setGravity(Gravity.CENTER);
mFooterView.setTextSize(22);
}

public MySwipeRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
mFooterView = new TextView(mContext);
mFooterView.setText("正在加载中");
mFooterView.setGravity(Gravity.CENTER);
mFooterView.setTextSize(22);
}

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if(view ==null){
if(getChildAt(0)instanceof ListView){
view = (ListView)getChildAt(0);
}
}
}
/**
* 在分发事件的时候处理子控件的触摸事件
*
* @param ev
* @return
*/
private float mDownY, mUpY, lastFloat ;

bcd7
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {

switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
// 移动的起点
mDownY = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
float mMoveY = ev.getY();
// 移动过程中判断时候能上拉加载更多
if (isLoadMore()&&!isShowing&&lastFloat>mMoveY+5) {
// 加载数据
setShowing(true);
}
lastFloat = mMoveY;
break;
case MotionEvent.ACTION_UP:
// 移动的终点
mUpY = getY();
if (isShowing) {
// 加载数据
if(listener!=null){
isLoading = true;
listener.Refresh();
}
}
lastFloat = 0;
break;
}
return super.dispatchTouchEvent(ev);
}
/**
* 设置加载状态,是否加载传入boolean值进行判断
*
* @param showing
*/
public void setShowing(boolean showing) {
isShowing = showing;
if (isShowing) {
// 显示布局
view.addFooterView(mFooterView);
} else {
// 隐藏布局
view.removeFooterView(mFooterView);

// 重置滑动的坐标
mDownY = 0;
mUpY = 0;
isLoading = showing;
}
}

private synchronized boolean isLoadMore() {
boolean isLast = view.getLastVisiblePosition() == view.getAdapter().getCount()-1;
return isLast&&!isLoading;
}
public void setOnListScrollListener(OnListScrollListener listener){
this.listener = listener;
}
public interface OnListScrollListener{
void Refresh();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: