9

I would like to implement a swipe gesture to delete rows in a ListView similar to the android notifications.

Right now all I have is a ListView with an onTouchListener - that said, I already have swipe detection working.

gestureDetector = new GestureDetector(this, new GestureListener());
onTouchListener = new TouchListener();  
listview.setOnTouchListener(onTouchListener);  

My GestureListener class:

protected class GestureListener extends SimpleOnGestureListener
{
    private static final int SWIPE_MIN_DISTANCE = 150;
    private static final int SWIPE_MAX_OFF_PATH = 100;
    private static final int SWIPE_THRESHOLD_VELOCITY = 100;

    private MotionEvent mLastOnDownEvent = null;

    @Override
    public boolean onDown(MotionEvent e)
    {
        mLastOnDownEvent = e;
        return super.onDown(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) {
                Toast.makeText(getApplicationContext(), "Right Swipe", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getApplicationContext(), "Left Swipe", Toast.LENGTH_SHORT).show();
            }
            return true;
        }
        else if (Math.abs(dX) < SWIPE_MAX_OFF_PATH && Math.abs(velocityY)>=SWIPE_THRESHOLD_VELOCITY && Math.abs(dY)>=SWIPE_MIN_DISTANCE ) {
            if (dY>0) {
                Toast.makeText(getApplicationContext(), "Up Swipe", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getApplicationContext(), "Down Swipe", Toast.LENGTH_SHORT).show();
            }
            return true;
        }
        return false;
    }
}

My TouchListener class:

protected class TouchListener implements View.OnTouchListener
{
    @Override
    public boolean onTouch(View v, MotionEvent e)
    {
        if (gestureDetector.onTouchEvent(e)){
            return true;
        }else{
            return false;
        }
    }
}

Are there some tutorials / examples on that?

thanks

Chilledrat
  • 2,593
  • 3
  • 28
  • 38
marcin
  • 389
  • 2
  • 5
  • 14

4 Answers4

4

If you have your swipe detection working, all that is left is to delete the item. For that, the following code will delete the item off screen.

yourListViewAdapter.yourListItems.remove(position);
yourListViewAdapter.notifyDataSetChanged();
wdziemia
  • 1,429
  • 1
  • 14
  • 19
  • do i need to implement the swipe detection on each listitem? or can i leave it on the listview and get the item to delete with other means? and how can i make the item actually throw the view? – marcin Jun 01 '12 at 07:21
  • @marcin no, you can just set it for the listview. Click [here](http://stackoverflow.com/questions/4373485/android-swipe-on-list) to see how to implement that exactly – wdziemia Jun 01 '12 at 15:35
3

You can achieve a nice effect by adding this to your swipe detection:

            //if swipe to left detected
            Display display = getWindowManager().getDefaultDisplay();
            v.clearAnimation();
            TranslateAnimation translateAnim = new TranslateAnimation(0, -display.getWidth(), 0, 0);
            translateAnim.setDuration(250);
            translateAnim.setAnimationListener(new Animation.AnimationListener() {

                @Override
                public void onAnimationStart(Animation animation) {
                }

                @Override
                public void onAnimationRepeat(Animation animation) {
                }

                @Override
                public void onAnimationEnd(Animation animation) {   
                    yourListViewAdapter.yourListItems.remove(position);
                    yourListViewAdapter.notifyDataSetChanged();
                }
            });
            v.startAnimation(translateAnim);
htafoya
  • 18,261
  • 11
  • 80
  • 104
1

i guess i really have to implement a touch listener on every row in the list. -> look for custom ArrayAdapter

as for throwing items, i found a great tutorial that answers most of my questions: http://mobile.tutsplus.com/tutorials/android/android-gesture/

marcin
  • 389
  • 2
  • 5
  • 14
  • i should've examined this tut better. it's about drawing on canvas. so it really is not about my problem. – marcin Jun 01 '12 at 10:47
0

In my search for some kind of swipe listener, I came across Roman Nurik's Swipe code. [1]: https://github.com/romannurik/android-swipetodismiss

I've been using this in my app and it works like a charm!

It's written in the same way an implemented listener would so I found it easy to work with.

Havnar
  • 2,558
  • 7
  • 33
  • 62