您的位置:首页 > 移动开发 > Android开发

Android ListView下拉刷新上拉加载更多的实现

2014-03-01 12:09 615 查看
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListAdapter;
import android.widget.ListView;

public class PullRefreshListView extends ListView implements View.OnTouchListener, AbsListView.OnScrollListener {

public static interface OnPullListener {

/*刷新
*@param     滑动的距离绝对值
*/
public void toRefresh(float movedDistance);

/*加载更多
*@param     滑动的距离绝对值
*/
public void toLoadMore(float movedDistance);
}

//是否处于刷新状态
private boolean isRefresh;

//是否处于加载更多状态
private boolean isLoadMore;

//Down触摸事件的Y坐标
private float startY;

//滑动的距离
private float distanceY;

//刷新及加载更多的回调接口
private OnPullListener pullListener;

public PullRefreshListView(Context context) {
super(context);
init();
}

public PullRefreshListView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

public PullRefreshListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}

private void init() {
setOnScrollListener(this);
setOnTouchListener(this);
}

public void setOnPullListener(OnPullListener pullListener) {
this.pullListener = pullListener;
}

@Override
public void setAdapter(ListAdapter adapter) {
super.setAdapter(adapter);

}

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {

isRefresh = false;
isLoadMore = false;
switch (scrollState) {
case SCROLL_STATE_TOUCH_SCROLL:
case SCROLL_STATE_IDLE:
if (getFirstVisiblePosition() == 0) {
isRefresh = true;
}
if (getAdapter()!=null&&getLastVisiblePosition() == getAdapter().getCount() - 1) {
isLoadMore = true;
}
break;

default:
break;
}
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

}

@Override
public boolean onTouch(View v, MotionEvent event) {

if (pullListener == null) {
return super.onTouchEvent(event);
}

if (isRefresh || isLoadMore) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
distanceY = 0;
startY = event.getY();
break;

case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:

distanceY = event.getY() - startY;
if (distanceY >= 0) {
pullListener.toRefresh(distanceY);
} else {
pullListener.toLoadMore(-distanceY);
}
break;

default:
break;

}
}

return super.onTouchEvent(event);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息