J'ai un RecyclerView horizontal dans une hiérarchie complexe qui ressemble à ceci -
<ViewPager id="+@id/first"> <ViewPager id="+@id/second"> this viewpager is taking away the scroll event <SwipeToRefreshLayout> <RecyclerView> //this one is vertical <RecyclerView id="@id/rv1"> //this one is horizontal <RecyclerView id="@id/rv2"> //this one is working fine (different type) </RecyclerView> </SwipeToRefreshLayout> </ViewPager> </ViewPager>
Maintenant, le problème est que le deuxième ViewPager détourne le scroll de Horizontal RV. Il existe 2 types de VR horizontaux (RV1 et RV2) dans ce RV vertical. Mais un seul d'entre eux (RV1) est confronté à ce problème. Le second (RV2) fonctionne correctement. De plus, lorsque j'appuie et maintiens, le défilement fonctionne correctement. Et lorsque RV1 est déjà en train de défiler et n'a pas réglé, le défilement fonctionne également très bien. J'ai fait référence à d'autres réponses concernant la définition de nestedScrolling false. Rien ne semble fonctionner.
3 Réponses :
La vue pager et la vue horizontale du recycleur peuvent toutes deux défiler horizontalement, il est donc devenu difficile pour le système d'exploitation de savoir lequel faire défiler. Vous devez donc utiliser ViewPager non-swipeable à la place de votre deuxième ViewPager, consultez cette réponse pour savoir comment utiliser non-swipeable ViewPager.
Cela désactivera complètement le visualiseur. Et je ne veux pas de ça.
Non, vous pouvez changer l'onglet en cliquant directement sur l'onglet.
Je voulais dire que j'avais besoin des gestes pour travailler. Il fonctionne sur RV2 mais pas sur RV1. Alors je veux savoir ce qui me manque ici.
Vous pouvez y parvenir en remplaçant la méthode onInterceptTouchEvent:
mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { int action = e.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: rv.getParent().requestDisallowInterceptTouchEvent(true); break; } return false; } @Override public void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } });
Cette réponse est la version kotlin de la réponse de @Astril Veliy
yourRecyclerView.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener { override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {} override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean { when (e.action) { MotionEvent.ACTION_DOWN -> { yourRecyclerView.parent?.requestDisallowInterceptTouchEvent(true) } } return false } override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {} })