3
votes

Recycleur horizontalLa vue à l'intérieur de ViewPager ne défile pas

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.


0 commentaires

3 Réponses :


1
votes

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.


3 commentaires

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.



7
votes

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

            }
        });


0 commentaires

1
votes

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


0 commentaires