Метод onTouch () не получает ACTION_DOWN - PullRequest
0 голосов
/ 17 октября 2018

У меня есть приложение, в котором мне нужно отобразить несколько RecyclerView внутри ConstraintLayout внутри NestedScrollView внутри SwipeRefreshLayout.

Все RecyclerView имеют LinearLayoutManager с горизонтальной ориентацией.

Итак, мое текущее дерево макетов выглядит следующим образом:

<SwipeRefreshLayout>
    <NestedScrollView>
        <ConstraintLayout>
            <RecyclerView></RecyclerView>
            <RecyclerView></RecyclerView>
            <RecyclerView></RecyclerView>
        ...
        </ConstraintLayout>
    </NestedScrollView>
</SwipeRefreshLayout>

То, чего я пытаюсь добиться, похоже на то, что приложение Google Play имеет на главном экране.

Моя проблема в том, что RecyclerView s слишком требовательны к тому, что можно считать горизонтальным движением.

Я пытался setNestedScrollingEnabled(false), но безрезультатно.

Затем я начализучить onTouch() методы всего выше RecyclerView s, и я обнаружил, что ACTION_DOWN из MotionEvent появляется, только если я прокручиваю очень медленно - что-либо, что можно считать смахиванием / броском, не производит ACTION_DOWN, только ACTION_MOVE и ACTION_UP.

Что-то я не знаю об этой конструкции?Какой-то вид потребляет ACTION_DOWN?

И дополнительный вопрос - есть ли примеры воссоздания не только внешнего вида главного экрана Google Play, но и ощущения?Их горизонтальные списки гораздо проще, когда дело доходит до горизонтальной прокрутки.

РЕДАКТИРОВАТЬ: Добавил OnItemTouchListener ко всем моим RecyclerView с.Он правильно перехватывает ВСЕ пролистывания / сбрасывания / прокрутки, но не все запускают OnSwipeListener.Вот кодПримечание: OnSwipeListener взят из этого ответа с небольшим добавлением onScroll метода

public class MyOnItemTouchListener extends RecyclerView.SimpleOnItemTouchListener {

    private GestureDetectorCompat mDetector;
    private OnSwipeListener mListener = new OnSwipeListener() {

        @Override public boolean onSwipe(Direction direction) {
            Log.d("Tag", "OnItemListener direction=" + direction);
            return super.onSwipe(direction);
        }
    };

    public HomeOnItemTouchListener(Context context) {
        mDetector = new GestureDetectorCompat(context, mListener);
    }

    @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        Log.d("Tag", "OnItemListener intercept MotionEvent=" + e);
        mDetector.onTouchEvent(e);
        return super.onInterceptTouchEvent(rv, e);
    }

    @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) {
        Log.d("Tag", "OnItemListener onTouch MotionEvent=" + e);
        mDetector.onTouchEvent(e);
        super.onTouchEvent(rv, e);
    }
}
...