package com.yuyh.library.view.list;
import android.content.Context;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import com.yuyh.library.view.listener.OnLoadMoreListener;
/**
* 判断滑动到底部Listview,可用于拉到底部自动触发加载更多
*
* @author yuyh.
* @date 16/4/10.
*/
public abstract class TBListView extends ListView implements
OnScrollListener {
protected Context mContext;
protected LayoutInflater mInflater;
protected int mFirstVisibleItem;
protected boolean mIsTop;
protected boolean mIsBottom;
protected OnLoadMoreListener onLoadMoreListener;
protected Point mDownPoint;
protected Point mMovePoint;
protected Point mUpPoint;
public TBListView(Context context) {
this(context, null);
}
public TBListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TBListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
private void init(Context context) {
mContext = context;
mInflater = LayoutInflater.from(context);
setOnScrollListener(this);
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
mFirstVisibleItem = firstVisibleItem;
if (view.getFirstVisiblePosition() == 1) {
mIsTop = true;
// 滑动到顶部
} else if (onLoadMoreListener != null && view.getLastVisiblePosition() == view.getCount() - 1) {
mIsBottom = true;
onLoadMoreListener.onLoadMore();
// 滑动到底部
} else {
mIsTop = false;
mIsBottom = false;
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
int x = 0;
int y = 0;
switch (action) {
case MotionEvent.ACTION_DOWN:
x = (int) ev.getX();
y = (int) ev.getY();
mDownPoint = new Point(x, y);
onDown(ev);
break;
case MotionEvent.ACTION_MOVE:
x = (int) ev.getX();
y = (int) ev.getY();
mMovePoint = new Point(x, y);
onMove(ev);
break;
case MotionEvent.ACTION_UP:
x = (int) ev.getX();
y = (int) ev.getY();
mUpPoint = new Point(x, y);
onUp(ev);
break;
}
return super.onTouchEvent(ev);
}
public abstract void onDown(MotionEvent ev);
public abstract void onMove(MotionEvent ev);
public abstract void onUp(MotionEvent ev);
public OnLoadMoreListener getOnLoadMoreListener() {
return onLoadMoreListener;
}
public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
this.onLoadMoreListener = onLoadMoreListener;
}
}