android listview 右滑删除(android 项目心得五)
16lz
2021-01-23
这次交大家使用listview的右滑删除,其实也非常简单,
首先需要自定义listview,具体代码如下:
package com.example.myapp;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.VelocityTracker;import android.view.View;import android.view.ViewConfiguration;import android.view.WindowManager;import android.widget.AdapterView;import android.widget.ListView;import android.widget.Scroller;public class SlideListView extends ListView { private int slidePosition; private int downY; private int downX; private int screenWidth; private View itemView; private Scroller scroller; private static final int SNAP_VELOCITY = 600; private VelocityTracker velocityTracker; private boolean isSlide = false; private int mTouchSlop; private RemoveListener mRemoveListener; private boolean isRemove = false; private RemoveDirection removeDirection; public enum RemoveDirection { RIGHT, LEFT, NONE; } public SlideListView(Context context) { this(context, null); } public SlideListView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SlideListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); screenWidth = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth(); scroller = new Scroller(context); mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); } public void setRemoveListener(RemoveListener removeListener) { this.mRemoveListener = removeListener; } @Override public boolean dispatchTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { addVelocityTracker(event); if (!scroller.isFinished()) { return false; } downX = (int) event.getX(); downY = (int) event.getY(); slidePosition = pointToPosition(downX, downY); if (slidePosition == AdapterView.INVALID_POSITION) { return super.dispatchTouchEvent(event); } itemView = getChildAt(slidePosition - getFirstVisiblePosition()); break; } case MotionEvent.ACTION_MOVE: { if (Math.abs(getScrollVelocity()) > SNAP_VELOCITY || (Math.abs(event.getX() - downX) > mTouchSlop && Math .abs(event.getY() - downY) < mTouchSlop)) { isSlide = true; } break; } case MotionEvent.ACTION_UP: recycleVelocityTracker(); break; } return super.dispatchTouchEvent(event); } private void scrollRight() { removeDirection = RemoveDirection.RIGHT; final int delta = (screenWidth + itemView.getScrollX()); scroller.startScroll(itemView.getScrollX(), 0, -delta, 0, Math.abs(delta)); postInvalidate(); } private void scrollLeft() { removeDirection = RemoveDirection.LEFT; final int delta = (screenWidth - itemView.getScrollX()); scroller.startScroll(itemView.getScrollX(), 0, delta, 0, Math.abs(delta)); postInvalidate(); } private void scrollBack(){ removeDirection = RemoveDirection.NONE; scroller.startScroll(itemView.getScrollX(), 0, -itemView.getScrollX(), 0, Math.abs(itemView.getScrollX())); postInvalidate(); } private void scrollByDistanceX() { if (itemView.getScrollX() >= screenWidth / 2) { scrollLeft(); } else if (itemView.getScrollX() <= -screenWidth / 2) { scrollRight(); } else { scrollBack(); } } @Override public boolean onTouchEvent(MotionEvent ev) { if (isSlide && slidePosition != AdapterView.INVALID_POSITION) { requestDisallowInterceptTouchEvent(true); addVelocityTracker(ev); final int action = ev.getAction(); int x = (int) ev.getX(); switch (action) { case MotionEvent.ACTION_DOWN: System.out.println("touch-->" + "down"); break; case MotionEvent.ACTION_MOVE: System.out.println("touch-->" + "move"); MotionEvent cancelEvent = MotionEvent.obtain(ev); cancelEvent.setAction(MotionEvent.ACTION_CANCEL | (ev.getActionIndex()<< MotionEvent.ACTION_POINTER_INDEX_SHIFT)); onTouchEvent(cancelEvent); int deltaX = downX - x; itemView.scrollTo(deltaX, 0); itemView.setAlpha(1f - Math.abs((float)deltaX/screenWidth)); return true; case MotionEvent.ACTION_UP: isSlide = false; int velocityX = getScrollVelocity(); if (velocityX > SNAP_VELOCITY) { scrollRight(); } else if (velocityX < -SNAP_VELOCITY) { scrollLeft(); } else { scrollByDistanceX(); } recycleVelocityTracker(); break; } } return super.onTouchEvent(ev); } @Override public void computeScroll() { if (scroller.computeScrollOffset()) { itemView.scrollTo(scroller.getCurrX(), scroller.getCurrY()); itemView.setAlpha(1f - Math.abs((float)scroller.getCurrX()/screenWidth)); postInvalidate(); if (scroller.isFinished() && removeDirection != RemoveDirection.NONE) { if (mRemoveListener == null) { throw new NullPointerException("RemoveListener is null, we should called setRemoveListener()"); } itemView.scrollTo(0, 0); itemView.setAlpha(1f); mRemoveListener.removeItem(removeDirection, slidePosition); } } } private void addVelocityTracker(MotionEvent event) { if (velocityTracker == null) { velocityTracker = VelocityTracker.obtain(); } velocityTracker.addMovement(event); } private void recycleVelocityTracker() { if (velocityTracker != null) { velocityTracker.recycle(); velocityTracker = null; } } private int getScrollVelocity() { velocityTracker.computeCurrentVelocity(1000); int velocity = (int) velocityTracker.getXVelocity(); return velocity; } public interface RemoveListener { public void removeItem(RemoveDirection direction, int position); }}
然后使用SlideListView .setRemoveListener listview的这个方法就可以实现listview的右滑删除了。
更多相关文章
- Android判断横屏竖屏代码
- 代码中如何设置TextView为不可见
- Android AlertDialog的基本使用方法
- Android之设置横、竖屏方法
- android截屏代码:C++实现
- Android 异步任务加载图片代码