我想要實現一個包含垂直ScrollView
有幾個水平RecyceViews
爲孩子們的活動!嵌套水平RecycleView中斷
但有時我面對奇怪的觸摸從內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
的實例並添加到它!
而不是使用scrollview ...爲什麼你不能使用recyclerview本身 – Jeevanandhan
@Jeevanandhan,因爲我的主要活動是動態的,不同的視圖可以添加到服務器處理的滾動視圖,這樣做與recycleview是如此複雜和艱難 –
::我認爲recycleview不像scrollview那樣複雜,因爲在recyclerview中我們可以在適配器中使用getItemViewType方法。一些如何在scrollview中動態加載數據,你可能會做一些驗證來填充數據。在recyclerview適配器中的getItemViewType方法中執行此操作,並創建獨立的視圖持有者,這樣您也可以實現代碼的可重用性。例如我會分享你一個鏈接,我不會給你確切的解決方案,但可能會幫助你的方法:) https://stackoverflow.com/a/44470106/1501864 – Jeevanandhan