Как можно предотвратить onTouch в прокрутке списка

#android #listview #ontouchlistener

#Android #listview #ontouchlistener

Вопрос:

У меня ситуация, когда у меня есть ViewPager, содержащий 3 фрагмента списка. Конечно, каждый ListFragment содержит ListView. У меня есть пользовательский макет для элементов. Чего я хотел бы добиться, так это того, что когда я нажимаю и удерживаю элемент, новый фрагмент начинается с анимации поверх текущего. Я хотел бы остановить анимацию (удалить фрагмент), как только пользователь отпустит элемент. Я реализовал это как onTouchListner (код ниже). Проблема в том, что пока я нажимаю элемент, я могу прокручивать список. Я хотел бы предотвратить это.

             @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction() amp; MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                    touchDownTime = event.getDownTime();
                    mDownX = event.getX();
                    mDownY = event.getY();
                    isOnClick = true;

                    break;
                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP:
                    if (isOnClick
                            amp;amp; fragment
                                    .isAnimation()) {
                        if (!fragment.isReleased()) {
                            fragment
                                    .cancelAnimation();
                        } else {
                            fragment
                                    .startReleaseAnimation();
                        }
                    }
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (isOnClick
                            amp;amp; !fragment
                                    .isAnimation()
                            amp;amp; (Math.abs(mDownX - event.getX()) > SCROLL_THRESHOLD || Math
                                    .abs(mDownY - event.getY()) > SCROLL_THRESHOLD)) {
                        isOnClick = false;
                    } else if (event.getEventTime() - touchDownTime > 150
                            amp;amp; !fragment
                                    .isAnimation()) {
                        FragmentTransaction transaction = fragmentManager.beginTransaction();

                        transaction
                                .add(R.id.container,
                                        fragment)
                                .addToBackStack(null).commit();
                    }
                    break;
                default:
                    break;
                }

                return true;
            }
        });
  

Ответ №1:

Вы должны попробовать requestDisallowInterceptTouchEvent

Это предотвратит перехват событий касания

попробуйте это

  @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction() amp; MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                    getParent().requestDisallowInterceptTouchEvent(true);
                    // Your code
                    break;
                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP:
                    getParent().requestDisallowInterceptTouchEvent(false);
                    // Your code
                    break;
                default:
                    break;
                }

                return true;
            }
        });