安卓"swipe left to right to delete",列表项上的手势,ICS风格



我正在尝试实现安卓ICS及以上版本中通知的"从左向右滑动删除"手势。我的应用程序中有一个列表视图。我的手势检测器在工作。但是当我在一个特定的列表项目上从左向右滑动时,我希望该项目能随着我的手指移动。当我移动手指超过某一点时,项目才应该删除自己。我目前使用的OnFling()方法无法实现这一点。

如何修改OnFling()方法以使项目随手指移动?

我的手势监听器类是

class GestureListener extends SimpleOnGestureListener {
        private static final int SWIPE_MIN_DISTANCE = 50;
        private static final int SWIPE_MAX_OFF_PATH = 100;
        private static final int SWIPE_THRESHOLD_VELOCITY = 25;
        private MotionEvent mLastOnDownEvent = null;
        @Override
        public boolean onDown(MotionEvent e) {
            mLastOnDownEvent = e;
            return super.onDown(e);
        }
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            // TODO Auto-generated method stub
            Toast.makeText(getApplicationContext(), "On Single TAP up ", Toast.LENGTH_SHORT).show();
            return super.onSingleTapUp(e);
        }
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {
            if (e1 == null) {
                e1 = mLastOnDownEvent;
            }
            if (e1 == null || e2 == null) {
                return false;
            }
            float dX = e2.getX() - e1.getX();
            float dY = e1.getY() - e2.getY();
            if (Math.abs(dY) < SWIPE_MAX_OFF_PATH
                    && Math.abs(velocityX) >= SWIPE_THRESHOLD_VELOCITY
                    && Math.abs(dX) >= SWIPE_MIN_DISTANCE) {
                if (dX > 0) {
                    int position = tasks.pointToPosition((int) e1.getX(),
                            (int) e1.getY());
                    int _id = (int) tasks.getItemIdAtPosition(position);
                    databaseConnector.deleteContact(_id);
                    new DeleteRow(_id, contactAdapter, getApplicationContext());
                contactAdapter.notifyDataSetChanged();

                    Toast.makeText(getApplicationContext(),
                            "Right Swipe" + _id, Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getApplicationContext(), "Left Swipe",
                            Toast.LENGTH_SHORT).show();
                }
                return true;
            }
            return false;
        }

如果你想实现这种类型的功能,你应该看看Roman Nurik在github上的滑动消除片段。你可以在这里找到它。

如果您能够使用更新的支持库,RecyclerView具有ItemTouchHelperonSwiped方法形式的一些内置功能,可以为您提供所需的行为。

根据这个非常有用的答案,该支持始于RecyclerView支持库的22.2.0版本:https://stackoverflow.com/a/30601554/1518546

最新更新