我想实现一个滑动手势来删除ListView
中类似于Android通知的行。
现在我所拥有的只是一个ListView
onTouchListener
- 说,我已经进行了滑动检测。
gestureDetector = new GestureDetector(this, new GestureListener());
onTouchListener = new TouchListener();
listview.setOnTouchListener(onTouchListener);
我的GestureListener
课程:
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;
}
}
我的TouchListener
课程:
protected class TouchListener implements View.OnTouchListener
{
@Override
public boolean onTouch(View v, MotionEvent e)
{
if (gestureDetector.onTouchEvent(e)){
return true;
}else{
return false;
}
}
}
是否有一些教程/示例?
感谢
答案 0 :(得分:4)
如果您的滑动检测工作正常,剩下的就是删除该项目。为此,以下代码将在屏幕外删除该项目。
yourListViewAdapter.yourListItems.remove(position);
yourListViewAdapter.notifyDataSetChanged();
答案 1 :(得分:3)
通过将其添加到滑动检测中,您可以获得很好的效果:
//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);
答案 2 :(得分:1)
我想我真的必须在列表的每一行上实现一个触摸监听器。 - &GT;寻找自定义ArrayAdapter
就投掷项目而言,我找到了一个很好的教程来解答我的大部分问题:http://mobile.tutsplus.com/tutorials/android/android-gesture/
答案 3 :(得分:0)
在我搜索某种滑动侦听器时,我遇到了Roman Nurik的滑动代码。 [1]:https://github.com/romannurik/android-swipetodismiss
我一直在我的应用中使用它,它就像一个魅力!
它以与实现的监听器相同的方式编写,因此我发现它很容易使用。