2017-10-12 15 views
0

私はこの質問hereと同じ問題を抱えていました。 問題は、フライミングが発生した後、RecyclerViewの子供がタッチイベントを取得しないということです。それは、recyclerviewが上または下に達するときだけ目立つ。「タッチした後にタッチが傍受される」という問題を改善するための方法

ここでの問題は、上部または下部の位置に達した後、リサイクラビューのスクロール状態がまだSCROLL_STATE_SETTLING(1秒または2秒間)のままであることです。この状態は、まだrecyclerviewがまだFlingアニメーションを終了していないことを意味します。そして、その状態では、単純なクリックイベントは、 "SETTLING"プロセスを停止するだけです。クリック後は正常に処理されます。

バグのようです...「SETTLING」プロセスは、上部に到達したら直ちに終了する必要があるためです。 RecycleViewクラスから

コード:

if (mScrollState == SCROLL_STATE_SETTLING) { 
       getParent().requestDisallowInterceptTouchEvent(true); 
       setScrollState(SCROLL_STATE_DRAGGING); 
      } 

私は)私の質問は 1である

this.addOnScrollListener(object : RecyclerView.OnScrollListener() { 

     override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) { 
      val canScrollUp = recyclerView?.canScrollVertically(-1)!! 
      val canScrollDown = recyclerView.canScrollVertically(1) 
      if (!canScrollUp || !canScrollDown) { 
       recyclerView.stopScroll() 
      } 

     } 
    }) 

このコードでそれを修正するために管理している、それはライブラリのバグをサポートしていますか? 2)この問題を解決するためのより適切な方法は何ですか?カスタムリスナーは私にとってはあまり良くないようです。

PS:私のビュー階層は、NestedScrollView内のRecyclerViewではありません。 AppbarとViewPagerの下ではRelativeLayoutであり、フラグメントを持っています。あなたの子ビューが利用可能なすべてのスペースを埋めるていないか、1つのページでPagerSnapHelperを使用している場合、それは失敗するので

ここ
<RelativeLayout 
    android:id="@+id/fragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 
    <android.support.v4.view.ViewPager 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
</RelativeLayout> 


<FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#fafafa"> 
    <android.support.v7.widget.RecyclerView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
      /> 
</FrameLayout> 

答えて

0

@Revazに別の回避策は、修正します。この場合、onScrolledは決して呼び出されません!

はあなたのLayoutManagerのstartSmoothScrollルーチンを上書き:

private final LinearLayoutManager mLayoutManager = new LinearLayoutManager(
     getContext(), 
     LinearLayoutManager.HORIZONTAL, false) { 

    @Override 
    public void startSmoothScroll(SmoothScroller smoothScroller) { 
     int[] out = mPagerSnapHelper.calculateDistanceToFinalSnap(
       mLayoutManager, mPagerSnapHelper.findSnapView(mLayoutManager)); 
     if (out[0] == 0 && out[1] == 0) { 
      // workarround "Touch Intercepted after fling” 
      // no scroll needed 
      MyRecyclerView.this.stopScroll(); 
      return; 
     } 
     super.startSmoothScroll(smoothScroller); 
    } 
}; 

setLayoutManager(mLayoutManager); 

私の意見では、サポートライブラリで修正する必要があります。

関連する問題