/**
* 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 ;
@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();
}
}