Родительский RecyclerView принимает жесты, которые должны были быть для вложенного RecyclerView - PullRequest
4 голосов
/ 05 августа 2020

У меня есть вертикальный RecyclerView и вложенный горизонтальный RecyclerView в качестве одного из его дочерних элементов. Внутренний вид используется как карусель изображений с PagerSnapHelper. Я получаю неидеальное поведение, когда пытаюсь прокрутить внутреннее представление по горизонтали. Иногда родительский вид улавливает жест и прокручивает вертикально, хотя я намеревался прокрутить внутреннее представление по горизонтали. Есть ли способ настроить детектор прокрутки по умолчанию так, чтобы горизонтальная прокрутка была более плавной?

Ответы [ 2 ]

1 голос
/ 13 августа 2020

нижеприведенный подход пытается отключить события касания для родительского recyclerview при касании вложенного recyclerview.

    nestedRecyclerView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch (View v, MotionEvent event){
    int action = event.getAction();
    switch (action) {
        case MotionEvent.ACTION_DOWN:
            // Disallow parent to intercept touch events.
            v.getParent().requestDisallowInterceptTouchEvent(true);
            break;

        case MotionEvent.ACTION_UP:
            // Allow parent to intercept touch events.
            v.getParent().requestDisallowInterceptTouchEvent(false);
            break;
    }

    // Handle inner(child) touch events.
    v.onTouchEvent(event);
    return true;
}
});
0 голосов
/ 09 августа 2020

Можете ли вы попробовать использовать этот RecyclerView с overriden method в качестве родительского RecyclerView:

public class CustomRecyclerView extends RecyclerView {

    private int mTouchSlop;
    private float mPrevX;

    public CustomRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        switch (e.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mPrevX = MotionEvent.obtain(e).getX();
                break;

            case MotionEvent.ACTION_MOVE:
                final float eventX = e.getX();
                float xDiff = Math.abs(eventX - mPrevX);

                if (xDiff > mTouchSlop) {
                    return false;
                }
        }

        return super.onInterceptTouchEvent(e);
    }
}

пример в xml

<com.example.stackoverflow.CustomRecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...