web-dev-qa-db-fra.com

Faites défiler vers le haut dans RecyclerView avec LinearLayoutManager

J'ai un fragment dans lequel il y a RecyclerView avec LinearLayoutManager dans lequel il y a des éléments CardView. Il y a un bouton d'action flottant en cliquant sur lequel les éléments doivent défiler vers le haut. J'ai essayé d'utiliser scrollToPosition ainsi que scrollToPositionWithOffset avec RecyclerView et aussi avec LinearLayoutManager comme indiqué ci-dessous. Mais cela n'a aucun effet. Pourquoi cela est-il ainsi? Est-ce que quelqu'un peut m'aider s'il vous plait.

Et j'ai placé la RecyclerView directement à l'intérieur de la SwipeRefreshView dans le fichier xml. J'appelle setFloatingActionButton dès que l'adaptateur a été configuré pour RecyclerView.

 public void setFloatingActionButton(final View view) {
    float = (Android.support.design.widget.FloatingActionButton) getActivity().findViewById(R.id.float);
    float.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
    mRecyclerView.smoothScrollToPosition(0);


            Android.support.design.widget.Snackbar.make(view, "Scrolled to Top", Android.support.design.widget.Snackbar.LENGTH_SHORT)
                    .setAction("Ok", new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            LinearLayoutManager llm = (LinearLayoutManager) mRecyclerView.getLayoutManager();
                            llm.scrollToPosition(0);

                        }
                    })
                    .setActionTextColor(getActivity().getResources().getColor(R.color.coloLink))
                    .show();
        }
    });
}
44
SRBhagwat

En partant des commentaires ci-dessus, idéalement, remplacer

mRecyclerView.smoothScrollToPosition(0);

dans la onClick du bouton d'action flottante avec 

mLayoutManager.scrollToPositionWithOffset(0, 0);

devrait marcher. Vous pouvez également supprimer le code SnackBar, car vous n'en avez de toute façon pas besoin. Donc, dans l’ensemble, votre méthode ci-dessus devrait ressembler à

public void setFloatingActionButton(final View view) {
    float actionButton = (Android.support.design.widget.FloatingActionButton) getActivity()
            .findViewById(R.id.float);
    actionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView
                    .getLayoutManager();
            layoutManager.scrollToPositionWithOffset(0, 0);
        }
    });
}

Et si vous dites que cela ne fonctionne pas, vérifiez si la fonction onClick() est appelée ou non. Essayez d’ajouter un message de journal et de voir s’il est imprimé.

103
Antrromet

Utiliser la méthode smoothScrollToPosition() a fonctionné pour moi avec la dernière version d'Android.

layoutManager.smoothScrollToPosition(mRecyclerView, null, 0);
9
gunner_dev

Appelez 'scrollToPosition (0)' en utilisant ceci:

public void scrollToPosition(final int position) {
    if (mRecyclerView != null) {
        getHandler().post(new Runnable() {
            @Override
            public void run() {
                mRecyclerView.scrollToPosition(position);
                if (position == 0) {
                    LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
                    layoutManager.scrollToPositionWithOffset(0, 0);
                    mScrollView.fullScroll(View.FOCUS_UP);
                }
            }
        });
    }
}
3
Lee Hounshell

Dans mon cas, l'exigence était de renseigner la vue dans l'ordre inverse, ce qui a permis à la présentation de afficher la vue de dessous de la vue de défilement. n'a pas vraiment aidé. mon problème résolu lorsque j'ai créé la vue Recycler pour montrer l'enfant à la dernière position . recyclerView.scrollToPosition (longueur-1);

0
antroid