1

J'ai un RecyclerView où toutes les cellules sont une vue personnalisée. Dans ma vue personnalisée, j'ai quelque chose qui ressemble à un bouton. Et lorsque l'utilisateur appuie longuement sur ce bouton, il peut faire un geste de balayage.Une cellule RecyclerView peut-elle consommer des événements tactiles RecyclerViews?

Mais lorsque l'utilisateur balaie l'écran, RecyclerView défile vers le haut et vers le bas.

Mon affichage personnalisé peut-il utiliser ce mouvement de balayage avant que RecyclerView ne commence à défiler?

Dans ma vue personnalisée, j'ai implémenté un GestureDetector. Cela fonctionne si loin pour le clic et le long appui. J'ai également écrasé boolean onScroll (MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) et renvoyé true pour indiquer que l'événement de défilement est consommé mais que RecyclerView défile quand même.

EDIT:

Voici mon code (extrait):

class EventListView(context: Context, attrs: AttributeSet) : View(context, attrs), 
    GestureDetector. OnGestureListener, GestureDetector.OnDoubleTapListener { 

    private val gestureDetector: GestureDetector 


    init { 

     gestureDetector = GestureDetector(context, this) 
    } 


    override fun onTouchEvent(event: MotionEvent?): Boolean { 
     var result = gestureDetector.onTouchEvent(event); 
     if (!result) { 
      if (event?.action == MotionEvent.ACTION_UP) { 
       Timber.i("ACTION_UP") 

       animateAlpha(alpha, 0) 
       result = true; 
      } 
     } 

     return result; 
    } 


    // 
    // OnGestureListener 
    // 

    override fun onDown(e: MotionEvent): Boolean { 
     return isInside(e) 
    } 

    override fun onShowPress(e: MotionEvent) { 
     if (isInside(e)) 
      showPressState() 
    } 

    override fun onSingleTapUp(e: MotionEvent): Boolean { 
     return false 
    } 

    override fun onLongPress(e: MotionEvent) { 

    } 

    override fun onScroll(e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean { 
     return true 
    } 

    override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean { 
     return true 
    } 

    // 
    // OnDoubleTapListener 
    // 

    override fun onSingleTapConfirmed(e: MotionEvent): Boolean { 
     return false 
    } 

    override fun onDoubleTap(e: MotionEvent): Boolean { 
     return false 
    } 

    override fun onDoubleTapEvent(e: MotionEvent): Boolean { 
     return false 
    } 
} 
+0

Vous pouvez afficher votre code pour que les utilisateurs puissent voir eux-mêmes si vous faites quelque chose qui n'a pas de sens. –

+0

J'ai ajouté un extrait de code, il est écrit à Kotlin –

Répondre

0

D'accord, je l'ai eu. Lorsque j'appelle getParent().requestDisallowInterceptTouchEvent(true) dans ma vue personnalisée, RecyclerView arrête de défiler