webentwicklung-frage-antwort-db.com.de

Scrollen Sie automatisch zum Ende von RecyclerView

Ich habe ein Fragment, das eine RecyclerView in seiner Layoutdatei hat. Die RecyclerView enthält Nachrichten in einem Chat. Daher brauche ich natürlich die RecyclerView, um nach unten zu scrollen, wenn das Chat-Fragment geöffnet wird. 

Ich habe versucht, direkt auf der RecyclerView zu scrollen:

var mRecyclerView = view.FindViewById<RecyclerView>
mRecyclerView.ScrollToPosition(mMessages.Count-1);

Zweite Methode:

LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(Application.Context);
mRecyclerView.SetLayoutManager(mLinearLayoutManager);
mLinearLayoutManager.ScrollToPosition(mMessages.Count - 1);      

Dritte Methode:

LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(Application.Context);
mRecyclerView.SetLayoutManager(mLinearLayoutManager);
mLinearLayoutManager.ScrollToPositionWithOffset(mMessages.Count - 1, 0);

Leider passiert in beiden Fällen nichts. Anregungen wären sehr dankbar! 

8
rasperryPi

Bitte verwenden Sie smoothScrollToPosition, um Ihr Problem zu beheben Ich verwende immer smoothScrollToPosition zum Umleiten an eine beliebige Position.

Stellen Sie sicher, dass mMessages Größe gut ist, wenn Sie denken.

Beispiel,

RecyclerView rv = (RecyclerView)findViewById(R.id.recyclerView);
rv.smoothScrollToPosition(mMessages.count-1);
9

Sie können setStackFromEnd=true so einstellen, dass die Ansicht das letzte Element anzeigt. Die Layoutrichtung bleibt gleich.

Nach dem Bearbeiten habe ich aktualisiert: einfach so: 

   LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(Application.Context);
   mLinearLayoutManager.setStackFromEnd(true); 
   mRecyclerView.SetLayoutManager(mLinearLayoutManager);
   mRecyclerView.scrollToPosition(mMessages.Count-1);

bitte überprüfen Sie die Dokumentation .

Edit: Das Problem ist, dass Sie scrollToPosition aufrufen, ohne dass ein Layout-Manager auf die Recyclingübersicht gesetzt wird.

In Anbetracht der Funktion scrollToPosition in der Klasse RecyclerView ist Ihr Fall sinnvoll.

/**
     * Convenience method to scroll to a certain position.
     *
     * RecyclerView does not implement scrolling logic, rather forwards the call to
     * {@link Android.support.v7.widget.RecyclerView.LayoutManager#scrollToPosition(int)}
     * @param position Scroll to this adapter position
     * @see Android.support.v7.widget.RecyclerView.LayoutManager#scrollToPosition(int)
     */
    public void scrollToPosition(int position) {
        if (mLayoutFrozen) {
            return;
        }
        stopScroll();
        if (mLayout == null) {
            Log.e(TAG, "Cannot scroll to position a LayoutManager set. " +
                    "Call setLayoutManager with a non-null argument.");
            return;
        }
        mLayout.scrollToPosition(position);
        awakenScrollBars();
    }

Es kann nicht gescrollt werden, um einen LayoutManager-Satz zu positionieren. Rufen Sie setLayoutManager mit einem Nicht-Null-Argument auf.

4
ziLk

Ich glaube, Sie nennen es nicht richtig. Sie müssen den LinearLayoutManager auch zusammen mit der Recycler-Ansicht übergeben, damit er funktioniert. Hier wie ich es geschafft habe

mLayoutManager.smoothScrollToPosition(mRecyclerView, null, array.size() - 1);
2
Irfan Raza

Ich habe das Problem gefunden. Setzen Sie RecyclerView scrollToPosition oder smoothScrollToPosition, nachdem Sie den LayoutManager festgelegt haben.

RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.scrollToPosition(mMessages.count - 1);

Ich hoffe es hilft dir.

1
Shamsul

Setzen Sie einfach setStackFromEnd=true oder setReverseLayout=true so, dass Elemente von einem Ende aus in LLM angeordnet werden.

Der Unterschied zwischen diesen beiden besteht darin, dass setStackFromEnd die Ansicht so einstellen wird, dass das letzte Element angezeigt wird. Die Layoutrichtung bleibt dabei gleich. (In einer horizontalen Recycler-Ansicht von links nach rechts wird also das letzte Element angezeigt, und beim Scrollen nach links werden die früheren Elemente angezeigt.)

Während setReverseLayout die Reihenfolge der vom Adapter hinzugefügten Elemente ändert. Das Layout beginnt mit dem letzten Element, das sich in einer LTR-Recycler-Ansicht am weitesten links befindet. Wenn Sie nach rechts scrollen, werden die vorherigen Elemente angezeigt.

Probe :

final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setReverseLayout(true);
_listView.setLayoutManager(linearLayoutManager);
0
Vishrut Mavani