2017-10-12 2 views
0

J'ai eu le même problème que dans cette question here. Le problème est que, après le lancement, les enfants RecyclerView n'obtiennent pas d'événements tactiles. C'est seulement notable quand le recyclerview atteint le haut ou le bas.Meilleure façon de réparer "Touch Intercepted après fling"

Le problème ici est qu'après avoir atteint la position supérieure ou inférieure, l'état de défilement de la vue recycleur reste SCROLL_STATE_SETTLING (pendant 1 ou 2 secondes). Cet état signifie que recyclerview n'a pas encore terminé une animation de lancement. Et dans cet état, l'événement click simple n'arrête que le processus "SETTLING". Les clics suivants sont traités normalement.

Il semble bogué ... Parce que le processus "SETTLING" devrait être terminé immédiatement lorsqu'il a atteint le sommet.

Code de la classe RecycleView:

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

J'ai réussi à le fixer avec ce code

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() 
      } 

     } 
    }) 

Ma question est 1) Est-il soutenir bug bibliothèque? 2) Quelle est la meilleure façon de résoudre ce problème? L'écoute personnalisée ne semble pas si bonne pour moi. PS: ma hiérarchie d'affichage n'est pas RecyclerView dans NestedScrollView. C'est RelativeLayout sous Appbar et viewPager avec des fragments.

<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> 

Répondre

0

Voici une autre solution de contournement pour @Revaz fixer, car il échouera si votre point de vue de l'enfant ne remplissent pas tout l'espace disponible ou que vous utilisez PagerSnapHelper avec une seule page. Dans ce cas onScrolled ne sera jamais appelé!

écrasera votre routine de 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); 

Doit être corrigé dans la bibliothèque de support à mon avis!