Сделайте RecyclerView "прозрачным" для прикосновения

У меня есть RecyclerView. Я хочу прокрутить его как ViewPager с TabLayout и вкладками (я сделал это). Я НЕ хочу прокручивать его пальцами, носом, локтями или другими пальцами моего или другого пользователя. Но я хочу, чтобы пользователь или я могли использовать одни и те же пальцы, носы или локти для взаимодействия с itemView или viewHolder этого RecyclerView. К LinearLayoutManager прикреплен горизонтальный RecyclerView, а внутри каждого из ScrollView есть itemView вертикальной ориентации. Я хочу, чтобы пользователь мог прокручивать ScrollView по вертикали, но если его палец по какой-то причине перемещается влево или вправо, прокрутка RecyclerView не должна реагировать.

Я могу добавить переопределение метода canScrollHorizontally из LayoutManager, но оно вообще нарушает горизонтальную прокрутку - даже я выбираю вкладки.

Я могу добавить перехватывающий сенсорный прослушиватель в дочерние элементы ресайклера, который будет вызывать recycler.requestDisallowInterceptTouchEvent(true), но он работает, пока ребенок может прокручивать, как только он не может (палец идет влево или вправо), касание переходит к RecyclerView, и я получаю горизонтальную прокрутку.

Как сделать RecyclerView полностью «прозрачным» для касания?

0
0
77
1

Ответы 1

Я нашел простой способ - переопределить onInterceptTouchEvent

public class TouchTransparentRecyclerView extends RecyclerView {
    public TouchTransparentRecyclerView(Context context) {
        super(context);
    }

    public TouchTransparentRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TouchTransparentRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        View childViewUnder = findChildViewUnder(e.getX(), e.getY());
        if (childViewUnder instanceof ViewGroup)
            return ((ViewGroup) childViewUnder).onInterceptTouchEvent(e);
        else
            return super.onInterceptTouchEvent(e);
    }
}

Другие вопросы по теме