Вложенный горизонтальный RecycleView в вертикальных сенсорных прерываниях ScrollView

Я хочу реализовать деятельность, которая содержит вертикальный ScrollView который имеет несколько горизонтальных RecyceViews как дети!

но иногда я сталкиваюсь со странным прикосновением прерываний изнутри RecycleViews, когда я пытаюсь прокрутить в вертикальном направлении, и моя начальная точка касания находится внутри элемента(из RecycleView) прокрутка ScrollView не работает правильно и не прокручивается в направлении Y!

Я пытаюсь реализовать свой собственный ScrollView а также RecycleView Для обработки сенсорных действий, но проблема все еще существует!

Вы можете посмотреть, что на самом деле происходит в этом видео: видео моей проблемы с приложениями

MyScrollView:

public class MyScrollView extends ScrollView {
    private GestureDetector mGestureDetector;

    public MyScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mGestureDetector = new GestureDetector(context, new YScrollDetector());
        setFadingEdgeLength(0);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);
    }

    @Override
    public boolean canScrollVertically(int direction) {
        return true;
    }


    @Override
    public boolean canScrollHorizontally(int direction) {
        return false;
    }

    // Return false if we're scrolling in the x direction
    class YScrollDetector extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            boolean result=Math.abs(distanceY) > Math.abs(distanceX);
            Log.d("ADAPTER MYSCR G = ",result+"");
            return result;
        }
    }

}

MyRecycleView:

public class MyRecycleView extends RecyclerView {
    private GestureDetector mGestureDetector;

    public MyRecycleView(Context context) {
        super(context);
        mGestureDetector = new GestureDetector(context, new MyRecycleView.XScrollDetector());
    }

    public MyRecycleView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mGestureDetector = new GestureDetector(context, new MyRecycleView.XScrollDetector());
    }

    public MyRecycleView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mGestureDetector = new GestureDetector(context, new MyRecycleView.XScrollDetector());
    }


    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        boolean result=super.onInterceptTouchEvent(e) && mGestureDetector.onTouchEvent(e);
        if(!result) {
            Log.d("ADAPTER MYREC G = ",result+"");
            View parent=((View) getParent());

            while (parent!=null){
                if(parent.getClass().getName().equals("class com.android.internal.policy.DecorView"))
                    break;
                if(parent instanceof MyScrollView) {
                    Log.d("MY SCROLL VIEW","FOUND AS PARENT!");
                    ((MyScrollView) parent).requestDisallowInterceptTouchEvent(false);
                    break;
                }
                parent= (View) parent.getParent();
            }

            this.stopScroll();
        }
        return result;
    }

    @Override
    public boolean canScrollHorizontally(int direction) {
        return true;
    }


    @Override
    public boolean canScrollVertically(int direction) {
        return false;
    }

    // Return false if we're scrolling in the y direction
    class XScrollDetector extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            boolean result=Math.abs(distanceY) < Math.abs(distanceX);
            return result;
        }
    }
}

и вот мой адаптер элементов RecycleView xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/lib/io.github.makbn.graphics"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_margin="2dp"
    android:background="@android:color/transparent"
    android:gravity="center"
    android:orientation="vertical">

    <android.support.v7.widget.CardView
        android:id="@+id/graphics_card_container"
        android:layout_width="115dp"
        android:layout_height="180dp"
        android:layout_marginBottom="3dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginTop="1dp"
        android:foreground="?android:attr/selectableItemBackground"
        app:cardBackgroundColor="#fff"
        android:clickable="true"
        android:focusableInTouchMode="false"
        android:filterTouchesWhenObscured="true"
        android:focusable="false"
        app:cardElevation="2dp"
        app:cardPreventCornerOverlap="true">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="vertical">
            <RelativeLayout
                android:id="@+id/layout_foodview_container"
                android:layout_width="match_parent"

                android:layout_height="wrap_content">

                <ImageView
                    android:id="@+id/graphics_img_icon"
                    android:layout_width="match_parent"
                    android:layout_height="80dp"
                    android:layout_gravity="center"
                    android:background="#00000000"
                    android:scaleType="centerCrop" />

                <RatingBar
                    style="@style/MyRatingBar_Style"
                    android:id="@+id/rating"
                    android:layout_width="match_parent"
                    android:layout_height="20dp"
                    android:layout_alignBottom="@+id/graphics_img_icon"
                    android:layout_centerInParent="true"
                    android:layout_gravity="center_horizontal"
                    android:isIndicator="true"
                    android:background="@color/white_overlay"
                    android:numStars="5" />
            </RelativeLayout>

            <TextView
                android:id="@+id/txt_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@+id/img_logo"
                android:layout_gravity="center"
                android:layout_margin="3dp"
                android:ellipsize="end"
                android:gravity="center"
                android:lines="2"
                android:maxLines="2"
                android:padding="2dp"
                android:text="نام محصول"
                android:textSize="12sp" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"></LinearLayout>

            <TextView
                android:id="@+id/txt_price"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom"
                android:background="@color/colorAccent"
                android:gravity="center_horizontal"
                android:padding="3dp"
                android:text="۷۵۰۰ ت"
                android:textColor="#fff"
                android:textSize="12sp" />
        </LinearLayout>
    </android.support.v7.widget.CardView>
</LinearLayout>

И по моему activty Я нахожу свой MyScrollView и создать несколько экземпляров MyRecycleView и добавить к этому!

1 ответ

Если я правильно понял вашу проблему, вам не нужно делать все это. Используйте NestedScrollView вместо scrollview.

Предложение. Я смотрел ваше видео. Вы также можете использовать вложенное представление переработчика, чтобы сделать ваш пользовательский интерфейс полностью динамичным. RecyclerView очень мощный с его ViewHolders. Вы можете добавить Горизонтальный RecyclerView в Элемент родительского просмотрщика и затем инициализировать внутренние recyclerView с адаптерами в методе onBind родительского объекта.

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