Расположение Android: Горизонтальный Recyclerview в Вертикальном Recyclerview в Viewpager с Поведениями Прокрутки

Это - приложение, которое я пытаюсь создать со всеми элементами, планировавшими ниже:

Veggies app

Все работает, однако, я хочу, чтобы внутренний горизонтальный recyclerview не получил любую из вертикальных прокруток. Все вертикальные прокрутки должны пойти к внешнему вертикальному recyclerview, не горизонтальный, так, чтобы вертикальная прокрутка позволила бы, чтобы панель инструментов вышла из представления согласно, он - scrollFlag.

Когда я указал на "часть" Завода StrawBerry recyclerview и прокрутки, это прокручивает панель инструментов:

strawberry plant

Если я указал на горизонтальный scrollview и прокрутку, это не прокручивает панель инструментов вообще.

Следующее является моим xml кодом расположения до сих пор.

Действие xml расположение:




    

    

        

        

        

    
    

    


"Фруктовый" фрагмент xml расположение (который является кодом для фрагмента - фрагмент маркирован в вышеупомянутом изображении):




    


    


Я использовал пользовательский класс под названием VerticallyScrollRecyclerView, который следует примеру Google обработки сенсорных событий в viewgroup. Его цель состоит в том, чтобы прервать и использовать все вертикальные события прокрутки так, чтобы она прокрутила в / панель инструментов: http://developer.android.com/training/gestures/viewgroup.html

Код для VerticallyScrollRecyclerView ниже:

public class VerticallyScrollRecyclerView extends RecyclerView {

    public VerticallyScrollRecyclerView(Context context) {
        super(context);
    }

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

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

    ViewConfiguration vc = ViewConfiguration.get(this.getContext());
    private int mTouchSlop = vc.getScaledTouchSlop();
    private boolean mIsScrolling;
    private float startY;

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        final int action = MotionEventCompat.getActionMasked(ev);
        // Always handle the case of the touch gesture being complete.
        if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
            // Release the scroll.
            mIsScrolling = false;
            startY = ev.getY();
            return super.onInterceptTouchEvent(ev); // Do not intercept touch event, let the child handle it
        }
        switch (action) {
            case MotionEvent.ACTION_MOVE: {
                Log.e("VRecView", "its moving");
                if (mIsScrolling) {
                    // We're currently scrolling, so yes, intercept the
                    // touch event!
                    return true;
                }
                // If the user has dragged her finger horizontally more than
                // the touch slop, start the scroll
                // left as an exercise for the reader
                final float yDiff = calculateDistanceY(ev.getY());
                Log.e("yDiff ", ""+yDiff);
                // Touch slop should be calculated using ViewConfiguration
                // constants.
                if (Math.abs(yDiff) > 5) {
                    // Start scrolling!
                    Log.e("Scroll", "we are scrolling vertically");
                    mIsScrolling = true;
                    return true;
                }
                break;
            }
        }
        return super.onInterceptTouchEvent(ev);
    }


    private float calculateDistanceY(float endY) {
        return startY - endY;
    }

}

"Любимое" расположение, которое является recyclerview в вертикальном recyclerview:





    

    
    


Это прослушивало меня некоторое время теперь, и мне не удалось предложить решение. Кто-либо знает, как решить эту проблему?

5 точек к Griffindor для корректного ответа и конечно, репутация указывает на ТАК.

59
задан 2 November 2015 в 23:19

1 ответ

если кто-либо все еще взгляд, попробуйте это:

private val Y_BUFFER = 10
private var preX = 0f
private var preY = 0f

mView.rv.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener {
        override fun onTouchEvent(p0: RecyclerView, p1: MotionEvent) {

            }

        override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
                when (e.action) {
                    MotionEvent.ACTION_DOWN -> rv.parent.requestDisallowInterceptTouchEvent(true)
                    MotionEvent.ACTION_MOVE -> {
                        if (Math.abs(e.x - preX) > Math.abs(e.y - preY)) {
                            rv.parent.requestDisallowInterceptTouchEvent(true)
                        } else if (Math.abs(e.y - preY) > Y_BUFFER) {
                            rv.parent.requestDisallowInterceptTouchEvent(false)
                        }

                    }
                }
                preX = e.x
                preY = e.y
                return false
            }

            override fun onRequestDisallowInterceptTouchEvent(p0: Boolean) {
            }
        })

это проверяет, если текущая прокрутка горизонтального затем не позволяет родителя handel событию

2
ответ дан 1 November 2019 в 12:08

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

Похожие вопросы: