Вложенный RecyclerView с горизонтальной прокруткой - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь реализовать вложенные RecyclerView с 3 слоями.Первый RecyclerView (родительский) вид установлен для вертикальной прокрутки.2-й RecyclerView (дочерний вид 1-го) установлен для горизонтальной прокрутки.3-й RecyclerView (потомок 2-го) также настроен на горизонтальную прокрутку.

Для визуализации:

-> RecyclerView с вертикальной прокруткой
-> RecyclerView с горизонтальной прокруткой
---> RecyclerView с горизонтальной прокруткой

Теперь проблема в том, что я не могу сделать 3-ю горизонтальную прокрутку RecyclerView в горизонтальном направлении.Я думаю, проблема в том, что устройство устанавливает приоритет горизонтальной прокрутки 2-го RecyclerView.

. Вы можете помочь мне решить эту проблему?

Это фрагмент кода для макета 1-гоодин с вертикальной прокруткой:

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"            
        android:layout_height="wrap_content"/>

</android.support.v4.widget.NestedScrollView>

Это для 2-го с горизонтальной прокруткой:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"            
        android:layout_height="wrap_content"/>

</LinearLayout>

Это для последнего с горизонтальной прокруткой:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

Я уже пытался перехватить касание с помощью onIntercept...(), чтобы отменить прокрутку 2-го RecyclerView во время касания 3-го.

1 Ответ

0 голосов
/ 29 апреля 2019
public class NestedScrollViewHome  extends NestedScrollView {
    @SuppressWarnings("unused")
    private int slop;
    @SuppressWarnings("unused")
    private float mInitialMotionX;
    @SuppressWarnings("unused")
    private float mInitialMotionY;
    public NestedScrollViewHome(Context context) {
        super(context);
        init(context);
    }
    private void init(Context context) {
        ViewConfiguration config = ViewConfiguration.get(context);
        slop = config.getScaledEdgeSlop();
    }
    public NestedScrollViewHome(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }
    public NestedScrollViewHome(Context context, AttributeSet attrs,
                              int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }
    private float xDistance, yDistance, lastX, lastY;
    @SuppressWarnings("unused")
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        final float x = ev.getX();
        final float y = ev.getY();
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                xDistance = yDistance = 0f;
                lastX = ev.getX();
                lastY = ev.getY();
                // This is very important line that fixes
                computeScroll();
                break;
            case MotionEvent.ACTION_MOVE:
                final float curX = ev.getX();
                final float curY = ev.getY();
                xDistance += Math.abs(curX - lastX);
                yDistance += Math.abs(curY - lastY);
                lastX = curX;
                lastY = curY;
                if (xDistance > yDistance) {
                    return false;
                }
        }
        return super.onInterceptTouchEvent(ev);
    }
    public interface OnScrollChangedListener {
        void onScrollChanged(NestedScrollView who, int l, int t, int oldl,
                             int oldt);
    }
    private OnScrollChangedListener mOnScrollChangedListener;
    public void setOnScrollChangedListener(OnScrollChangedListener listener) {
        mOnScrollChangedListener = listener;
    }
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (mOnScrollChangedListener != null) {
            mOnScrollChangedListener.onScrollChanged(this, l, t, oldl, oldt);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...