在verticall ScrollView触摸中断中嵌套水平RecycleView

时间:2017-08-17 07:54:46

标签: android android-recyclerview scrollview

我想实现一个包含垂直 ScrollView的活动,该活动有几个水平 RecyceViews作为孩子!

但是当我尝试在垂直方向中滚动并且我的开始触摸点位于内部时,我有时遇到来自内部RecycleViews的奇怪触摸中断项目RecycleView)滚动ScrollView无法正常工作且不向Y方向滚动!

我尝试实现自己的ScrollViewRecycleView来处理触摸操作,但问题仍然存在!

您可以观看此视频中的实际内容: video of my applications problem

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 个答案:

答案 0 :(得分:0)

如果我已正确理解您的问题,那么您不需要做所有这些。 使用 NestedScrollView 代替 scrollview

<强>建议: 我观看了您的视频,您还可以使用嵌套的recyclerview使您的UI完全动态化。 RecyclerView使用它的ViewHolders非常强大。您可以在父回收器视图的项目中添加Horizo​​ntal RecyclerView,然后在父进程的onBind方法中使用适配器初始化内部recyclelerViews。