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
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();
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);
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/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With