2017-08-17 93 views
0

我想要實現一個包含垂直ScrollView有幾個水平RecyceViews爲孩子們的活動!嵌套水平RecycleView中斷

但有時我面對奇怪的觸摸從內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的實例並添加到它!

+0

而不是使用scrollview ...爲什麼你不能使用recyclerview本身 – Jeevanandhan

+0

@Jeevanandhan,因爲我的主要活動是動態的,不同的視圖可以添加到服務器處理的滾動視圖,這樣做與recycleview是如此複雜和艱難 –

+0

::我認爲recycleview不像scrollview那樣複雜,因爲在recyclerview中我們可以在適配器中使用getItemViewType方法。一些如何在scrollview中動態加載數據,你可能會做一些驗證來填充數據。在recyclerview適配器中的getItemViewType方法中執行此操作,並創建獨立的視圖持有者,這樣您也可以實現代碼的可重用性。例如我會分享你一個鏈接,我不會給你確切的解決方案,但可能會幫助你的方法:) https://stackoverflow.com/a/44470106/1501864 – Jeevanandhan

回答

0

如果我已經正確理解你的問題,那麼你不需要做這一切。 使用NestedScrollView而不是滾動視圖

建議: 我觀看了您的視頻,您還可以使用嵌套的recyclerview使您的UI完全動態。 RecyclerView的ViewHolders功能非常強大。您可以在Parent recyclerview的Item中添加Horizo​​ntal RecyclerView,然後使用父適配器的onBind方法初始化內部recyclerViews。

+0

NestedRecycleview ??你是什麼意思? –

+0

使用NestedScrollView而不是ScrollView並沒有幫助! –

+0

你能分享更新的代碼嗎?你有沒有移動手勢檢測器? –

相關問題