我想实现一个包含垂直 ScrollView
的活动,该活动有几个水平 RecyceViews
作为孩子!
但是当我尝试在垂直方向中滚动并且我的开始触摸点位于内部时,我有时遇到来自内部RecycleViews
的奇怪触摸中断项目(RecycleView
)滚动ScrollView
无法正常工作且不向Y方向滚动!
我尝试实现自己的ScrollView
和RecycleView
来处理触摸操作,但问题仍然存在!
您可以观看此视频中的实际内容: 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
的多个实例并添加到其中!
答案 0 :(得分:0)
如果我已正确理解您的问题,那么您不需要做所有这些。 使用 NestedScrollView 代替 scrollview 。
<强>建议:强> 我观看了您的视频,您还可以使用嵌套的recyclerview使您的UI完全动态化。 RecyclerView使用它的ViewHolders非常强大。您可以在父回收器视图的项目中添加Horizontal RecyclerView,然后在父进程的onBind方法中使用适配器初始化内部recyclelerViews。