Добавляю OnSwipeTouchListener и перестаёт работать OnItemLongClickListener

Имеется активность, на ней список ListView. При клике на элемент списка происходит переход в другую активность, при долгом нажатии - выскакивает всплывающее меню с опциями действий (удалить и пр...)

Захотелось мне добавить в приложение переход в другую (третью) активность по свайпу. И, недолго поискав примеры, нашёл вполне себе рабочий и добавил в код. Проверил - всё работает, я щаслив. Но, как оказалось, внезапно и без объявления войны перестало работать долгое нажатие на элемент списка (с последующим вызовом меню). Вместо долгого нажатия срабатывает обычный клик setOnItemClickListener.

Убираю OnSwipeTouchListener - долгое нажатие setOnItemLongClickListener снова прекрасно работает.

Как я понял, (событие?) OnTouchListener происходит раньше всего, и потом управление отдаётся setOnItemClickListener.

Подскажите пожалуйста, возможна ли реализация свайпа и одновременно долгого нажатия? Или придётся отказаться от одного из способов?

public class MainScreen extends AppCompatActivity {

    private ListView lstMainNews;
    private ListView lstMails;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_screen);

        lstMails = findViewById(R.id.lstMails);

        //Обработка нажатия на Список (переход в список)
        lstMails.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                ItemMail item = (ItemMail) lstMails.getAdapter().getItem(position);
                // исполняемый код
            }
        });

        //Долгое нажатие (вызов меню)
        lstMails.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                ItemMail item = (ItemMail) lstMails.getAdapter().getItem(position);
                // исполняемый код
                return true;
            }
        });


        //Переход в раздел сообщений
        lstMails.setOnTouchListener(new OnSwipeTouchListener(MainScreen.this) {
            @Override
            public void onSwipeLeft() {
                // исполняемый код
            }
        });

Рукописная OnSwipeTouchListener (взята из примера в интернетах):

public class OnSwipeTouchListener implements OnTouchListener {

private final GestureDetector gestureDetector;

public OnSwipeTouchListener (Context ctx){
    gestureDetector = new GestureDetector(ctx, new GestureListener());
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    return gestureDetector.onTouchEvent(event);
}

private final class GestureListener extends SimpleOnGestureListener {

    private static final int SWIPE_THRESHOLD = 100;
    private static final int SWIPE_VELOCITY_THRESHOLD = 100;

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        boolean result = false;
        try {
            float diffY = e2.getY() - e1.getY();
            float diffX = e2.getX() - e1.getX();
            if (Math.abs(diffX) > Math.abs(diffY)) {
                if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffX > 0) {
                        onSwipeRight();
                    } else {
                        onSwipeLeft();
                    }
                    result = true;
                }
            }
            else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                if (diffY > 0) {
                    onSwipeBottom();
                } else {
                    onSwipeTop();
                }
                result = true;
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return result;
    }
}

public void onSwipeRight() {
}

public void onSwipeLeft() {
}

public void onSwipeTop() {
}

public void onSwipeBottom() {
}

}


Ответы (0 шт):