pulltoRefreshSwipeMenuListview 是一个带侧滑功能的可刷新控件,其缺点是该控件继承自listview,不能扩展到其他控件,优点是:使用方便,简单
其原理是:复写了listview,并复写其setAdapter方法,在为listview设置adapter的时候,为每一个item设置一个menu的adapter
@Override
public void setAdapter(ListAdapter adapter) {
if (mIsFooterReady == false) {
mIsFooterReady = true;
addFooterView(mFooterView);
}
// super.setAdapter(new SwipeMenuAdapter(getContext(),adapter){
// @Override
// public void createMenu(SwipeMenu menu) {
// super.createMenu(menu);
// }
// });
super.setAdapter(new SwipeMenuAdapter(getContext(), adapter) {
@Override
public void createMenu(SwipeMenu menu) {
if (mMenuCreator != null) {
mMenuCreator.create(menu);
}
}
@Override
public void onItemClick(SwipeMenuView view, SwipeMenu menu, int index) {
if (mOnMenuItemClickListener != null) {
mOnMenuItemClickListener.onMenuItemClick(view.getPosition(), menu, index);
}
if (mTouchView != null) {
mTouchView.smoothCloseMenu();
}
}
});
}
同时,实现了onScrollListener接口,监听用户的滑动操作
如果横向滑动的距离大于垂直滑动,这判断为侧滑,反之则是上拉或者下滑
if (Math.abs(dy) > MAX_Y) {
mTouchState = TOUCH_STATE_Y;
} else if (dx > MAX_X) {
mTouchState = TOUCH_STATE_X;
if (mOnSwipeListener != null) {
mOnSwipeListener.onSwipeStart(mTouchPosition);
}
}
如果为侧滑:
if (mTouchState == TOUCH_STATE_X) {
if (mTouchView != null) {
mTouchView.onSwipe(ev);
if (!mTouchView.isOpen()) {
mTouchPosition = -1;
mTouchView = null;
}
}
if (mOnSwipeListener != null) {
mOnSwipeListener.onSwipeEnd(mTouchPosition);
}
ev.setAction(MotionEvent.ACTION_CANCEL);
super.onTouchEvent(ev);
return true;
}
通过View view = getChildAt(mTouchPosition - getFirstVisiblePosition());获取item的view
通过onTouchEvent监听用户的滑动操作,如果是点击的listview内部
public boolean onSwipe(MotionEvent event) {
mGestureDetector.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mDownX = (int) event.getX();
isFling = false;
break;
case MotionEvent.ACTION_MOVE:
// Log.i(“byz”, “downX = ” + mDownX + “, moveX = ” + event.getX());
int dis = (int) (mDownX - event.getX());
if (state == STATE_OPEN) {
dis += mMenuView.getWidth();
}
swipe(dis);
break;
case MotionEvent.ACTION_UP:
if (isFling || (mDownX - event.getX()) > (mMenuView.getWidth() / 2)) {
// open侧滑菜单
smoothOpenMenu();
} else {
// close侧滑菜单
smoothCloseMenu();
return false;
}
break;
}
return true;
}