Scrollen Sie in RecyclerView mit LinearLayoutManager nach oben

73

Ich habe ein Fragment , in dem es RecyclerViewmit LinearLayoutManagerin der es CardViewGegenstände. Beim Klicken befindet sich eine schwebende Aktionsschaltfläche, über die die Elemente nach oben scrollen sollen. Ich habe versucht, sowohl mit scrollToPositionals auch scrollToPositionWithOffsetmit RecyclerViewund LinearLayoutManagerwie unten gezeigt zu verwenden. Aber es hat überhaupt keine Wirkung. Warum ist das so? Kann mir bitte jemand helfen.

Und ich habe die RecyclerViewdirekt SwipeRefreshViewin der XML-Datei platziert. Ich rufe setFloatingActionButtonan, sobald der Adapter auf eingestellt ist 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();
        }
    });
}
SRBhagwat
quelle
Versuchen SiemLayoutManager.scrollToPositionWithOffset(0, 0);
Antrromet
Ja, ich habe es versucht. Aber das hat auch keine Wirkung, genau wie scrollToPosition.
SRBhagwat
Das ist seltsam, denn selbst ich hatte ein ähnliches Layout wie deins. Ich hatte einen RecyclerViewmit Layout Manager und der wurde in einen gelegt SwipeRefreshview, und das hat bei mir funktioniert.
Antrromet
Gibt es ein Problem, wenn ich scrollToPosition aufrufe, sobald ich den Adapter auf recyclerview setze?
SRBhagwat
1
Jetzt habe ich mlayoutmanager.scrollToPositionWithOffset (0,0) platziert; außerhalb der Methode setFloatingAction Button und es funktioniert gut !!!
SRBhagwat

Antworten:

154

Fortsetzung von obigen Kommentaren, idealerweise ersetzen

mRecyclerView.smoothScrollToPosition(0);

in der onClickder schwebenden Aktionstaste mit

mLayoutManager.scrollToPositionWithOffset(0, 0);

sollte arbeiten. Sie können den SnackBarCode auch entfernen , da Sie ihn sowieso nicht benötigen. Alles in allem sollte Ihre obige Methode also so aussehen

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

Und wenn Sie sagen, dass das oben genannte nicht funktioniert, dann testen Sie, ob das onClick()überhaupt aufgerufen wird oder nicht. Fügen Sie eine Protokollnachricht hinzu und prüfen Sie, ob sie gedruckt wurde.

Antrromet
quelle
Ja, ich habe es tatsächlich bekommen, indem ich Aufrufe von anderen Fragmenten zu dieser Methode entfernt habe. Ich habe die Fab-Erstellung direkt in die onCreate () -Methode eingefügt. Sie funktioniert jetzt einwandfrei.
SRBhagwat
Und mit Snackbar funktioniert es nicht. Das ist in Ordnung, da keine Snackbar benötigt wird.
SRBhagwat
Diese Lösung funktioniert nur im ersten Fragment. Wenn ich setFloatingActionActionButton von beiden Farlements aus aufrufe, funktioniert scrollToTop nur im zweiten Fragment, aber nicht im ersten Fragment. Ich erweitere das zweite Fragment vom ersten Fragment. Können Sie mir helfen?
SRBhagwat
Warum nennst du das überhaupt im Fragment und nicht von der Aktivität?
Antrromet
Wie greife ich in der Hauptaktivität auf mRecyclerView zu und setze mRecyclerView.scrollToPosition (0) in der Hauptaktivität? Ich bin neu in Android sowie Java. Ich lerne viele Dinge während der Entwicklung dieser App
:)
14

Die Verwendung der Methode smoothScrollToPosition()hat bei mir mit der neuesten Android-Version funktioniert.

layoutManager.smoothScrollToPosition(mRecyclerView, null, 0);
gunner_dev
quelle
4

Rufen Sie 'scrollToPosition (0)' folgendermaßen auf:

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);
                }
            }
        });
    }
}
Lee Hounshell
quelle
Was ist mScrollView ..?
Sam
private NestedScrollView mScrollView;
Lee Hounshell
0

In meinem Fall bestand die Anforderung darin, die Ansicht in umgekehrter Reihenfolge zu füllen, wodurch das Layout die Unteransicht der Bildlaufansicht zeigte

layoutManager.smoothScrollToPosition(mRecyclerView, null, 'last_index') hat nicht wirklich geholfen.

Mein Problem wurde behoben, als ich die Recycler-Ansicht machte, um das Kind an der letzten Position zu zeigen

recyclerView.scrollToPosition(length-1)

Antroid
quelle