web-dev-qa-db-fra.com

Faites glisser un élément à la fois Recyclerview

J'ai essayé d'ajouter l'écouteur Scroll pour la vue recycleur et j'ai fait un peu de logique, mais je ne suis pas en mesure de glisser un élément à la fois. J'ai fait des recherches sur Internet mais j'ai obtenu une bibliothèque tierce qui a une vue de recyclage personnalisée. Pouvons-nous implémenter un seul élément à la fois dans la vue du recycleur? Si oui, dites comment? Un seul élément à la fois comme celui-ci image .

24
Akshay Bhat 'AB'

C'est tard, je sais.

Il existe un moyen très simple d'obtenir exactement le comportement de défilement demandé avec l'utilisation d'un SnapHelper personnalisé.

Créez votre propre SnapHelper en écrasant celui standard (Android.support.v7.widget.LinearSnapHelper).

public class SnapHelperOneByOne extends LinearSnapHelper{

    @Override
    public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY){

        if (!(layoutManager instanceof RecyclerView.SmoothScroller.ScrollVectorProvider)) {
            return RecyclerView.NO_POSITION;
        }

        final View currentView = findSnapView(layoutManager);

        if( currentView == null ){
            return RecyclerView.NO_POSITION;
        }

        final int currentPosition = layoutManager.getPosition(currentView);

        if (currentPosition == RecyclerView.NO_POSITION) {
            return RecyclerView.NO_POSITION;
        }

        return currentPosition;
    }
}

C'est fondamentalement la méthode standard, mais sans ajouter de compteur de sauts qui est calculé par la vitesse de défilement.

Si vous effectuez un balayage rapide et long, la vue suivante (ou précédente) sera centrée (illustrée).

Si vous glissez lentement et brièvement, la vue centrée actuelle reste centrée après la libération.

J'espère que cette réponse pourra encore aider n'importe qui.

21
Palm

Cela adoucit le mouvement entre les éléments:

public class SnapHelperOneByOne extends LinearSnapHelper {

    @Override
    public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) {

        if (!(layoutManager instanceof RecyclerView.SmoothScroller.ScrollVectorProvider)) {
            return RecyclerView.NO_POSITION;
        }

        final View currentView = findSnapView(layoutManager);

        if (currentView == null) {
            return RecyclerView.NO_POSITION;
        }

        LinearLayoutManager myLayoutManager = (LinearLayoutManager) layoutManager;

        int position1 = myLayoutManager.findFirstVisibleItemPosition();
        int position2 = myLayoutManager.findLastVisibleItemPosition();

        int currentPosition = layoutManager.getPosition(currentView);

        if (velocityX > 400) {
            currentPosition = position2;
        } else if (velocityX < 400) {
            currentPosition = position1;
        }

        if (currentPosition == RecyclerView.NO_POSITION) {
            return RecyclerView.NO_POSITION;
        }

        return currentPosition;
    }
}

Exemple:

LinearSnapHelper linearSnapHelper = new SnapHelperOneByOne();
linearSnapHelper.attachToRecyclerView(recyclerView);
7
Vladimir Escoto

https://github.com/googlesamples/Android-HorizontalPaging/

Cela a le lien vers quelque chose de similaire à ce que vous avez montré dans les images. Faites-moi savoir s'il y a quelque chose de plus que vous recherchez, et je relierai les bibliothèques pertinentes.

Fondamentalement, la différence entre ViewPager et recyclerView est que, dans recyclerView, vous basculez entre plusieurs éléments, tandis que dans ViewPager vous basculez entre plusieurs fragments ou pages indépendantes lui-même.

Je vois que vous utilisez ceci https://github.com/lsjwzh/RecyclerViewPager , avez-vous un cas d'utilisation particulier à l'esprit?

2
Varun Agarwal