天天看點

Android滑動删除listview的Item

要點:自定義ListView,overwrite方法 dispatchTouchEvent 和 onTouchEvent;使用Scroller工具類;

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            addVelocityTracker(ev);

            if (!mScroller.isFinished()) {
                return super.dispatchTouchEvent(ev);
            }
            // 起始位置,目前position
            mDownX = (int) ev.getX();
            mDownY = (int) ev.getY();
            int position = pointToPosition(mDownX, mDownY);
            if (position == mSlidePosition) break;

            mSlidePosition = position;

            if (mSlidePosition == INVALID_POSITION ) {
                return super.dispatchTouchEvent(ev);
            }

            // 恢複狀态
            clear();

            // 擷取目前界面
            View childView = getChildAt(mSlidePosition - getFirstVisiblePosition());
            mCurrentContentView = (View) childView.findViewById(R.id.view_content).getParent();
            mCurrentRemoveView = childView.findViewById(R.id.tv_remove);

            break;
        case MotionEvent.ACTION_MOVE:
            if (mCurrentContentView == null) break;

            if (Math.abs(getScrollVelocity()) > SNAP_VELOCITY
                    || (Math.abs(ev.getX() - mDownX) > mTouchSlop
                    && Math.abs(ev.getY() - mDownY) < mTouchSlop)) {
                // 開始滑動
                mIsSlide = true;
            }
            break;
        case MotionEvent.ACTION_UP:
            if (mCurrentContentView == null/* || mIsSlide*/) break;

            // 如果左滑小于4/5,按鈕不顯示
            if (mDelta < mMaxDistence * 4 / 5) {
                //mCurrentRemoveView.setVisibility(View.GONE);
                scrollRight();
            } else if (mDelta < mMaxDistence) {
                scrollLeft();
            }
            recycleVelocityTracker();
            mIsSlide = false;
            break;
    }

    return super.dispatchTouchEvent(ev);
}
           
@Override
public boolean onTouchEvent(MotionEvent ev) {
    if (mIsSlide && mSlidePosition != INVALID_POSITION) {
        final int action = ev.getAction();
        int x = (int) ev.getX();
        switch (action) {
            case MotionEvent.ACTION_MOVE:
                addVelocityTracker(ev);

                int deltaX = mDownX - x;
                mDownX = x;

                mDelta += deltaX;

                Log.i("onTouchEvent", "mDelta = "+ mDelta);
                if (mDelta < 0) {
                    mCurrentContentView.scrollTo(0, 0);

                    mDelta = 0;
                    //mCurrentRemoveView.setVisibility(View.GONE);
                } else if (mDelta >= mMaxDistence) {
                    mDelta = mMaxDistence;
                    mCurrentContentView.scrollTo(mMaxDistence, 0);
                    //mCurrentRemoveView.setVisibility(View.VISIBLE);
                    //mCurrentRemoveView.setTranslationX(0);
                } else {
                    mCurrentContentView.scrollBy(deltaX, 0);
                    //mCurrentRemoveView.setVisibility(View.VISIBLE);
                    //mCurrentRemoveView.setTranslationX(mMaxDistence - mDelta);
                }
                break;
        }
        return true;
    }
    return super.onTouchEvent(ev);
}
           

Demo 源碼位址:

https://download.csdn.net/download/yan072201/10921009

Android滑動删除listview的Item