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);
}
}
Android ListView下拉刷新上拉加载更多的实现
最新推荐文章于 2024-08-08 19:40:34 发布