划动以删除列表项

9
我希望在ListView中实现类似于Android通知栏的滑动手势来删除行。目前,我只有一个带有onTouchListenerListView,但是我已经成功实现了滑动检测。
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;
        }
    }
}

有一些关于这方面的教程/示例吗?
谢谢
4个回答

4
如果您已经实现了滑动检测,剩下的工作就是删除该项。为此,以下代码将会把该项从屏幕中删除。
yourListViewAdapter.yourListItems.remove(position);
yourListViewAdapter.notifyDataSetChanged();

我需要在每个列表项上实现滑动检测吗?还是可以将其留在ListView上,并通过其他方式获取要删除的项目?如何使项目实际抛出视图? - marcin
@marcin 不需要,你只需为listview设置即可。点击这里查看如何实现。 - wdziemia

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

1

我应该更仔细地检查这个教程。它是关于在画布上绘图的,所以它并不涉及我的问题。 - marcin

0
在寻找某种滑动监听器时,我发现了Roman Nurik的Swipe代码。[1]: https://github.com/romannurik/android-swipetodismiss 我在我的应用程序中使用它,它的效果非常好!
它的编写方式与实现监听器的方式相同,因此我发现很容易使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接