Добавляю 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() {
}
}