Android ListView实现滑动删除

左滑实现效果:

代码非常的简单:

首先我们需要重写ListView

代码如下:

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);
   }

}

xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.example.a.SlideListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lv_collect_listview"
        ></com.example.a.SlideListView>
</LinearLayout>

注意:在获取ListView控件是也需要使用重写后的类

SlideListView lv_collect_listview lv_collect_listview = (SlideListView)view.findViewById(R.id.lv_collect_listview);

设置滑动监听事件:
lv_collect_listview.setRemoveListener(new SlideListView.RemoveListener() {
    @Override
    public void removeItem(SlideListView.RemoveDirection direction,final int position) {

        switch (direction) {
            case LEFT://左滑
                AlertDialog.Builder builder=new AlertDialog.Builder(getActivity());
                builder.setTitle("提示:");
                builder.setMessage("您确定取消收藏吗?");

                //设置确定按钮
                builder.setNegativeButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        topics.remove(position);//在集合中删除当前滑动的数据
                        myAdapter.notifyDataSetChanged();//刷新适配器
                    }
                });
                //设置取消按钮
                builder.setPositiveButton("容我再想想",null);
                //显示提示框
                builder.show();
                break;
            case RIGHT://右滑
                break;
            default:
                break;
        }
    }

});

以上代码就可以实现左滑删除了!

发布了52 篇原创文章 · 获赞 47 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/zhangkaidsy/article/details/74852532