Woher wissen, ob ein RecyclerView / LinearLayoutManager nach oben oder unten gescrollt wird?

Lesezeit: 6 Minuten

Benutzer-Avatar
Saren Arterios

Derzeit verwende ich den folgenden Code, um zu prüfen, ob SwipeRefreshLayout aktiviert werden soll.

private void laySwipeToggle() {
    if (mRecyclerView.getChildCount() == 0 || mRecyclerView.getChildAt(0).getTop() == 0) {
        mLaySwipe.setEnabled(true);
    } else {
        mLaySwipe.setEnabled(false);
    }
}

Aber hier ist das Problem. Wenn es zur Grenze der Ansicht eines anderen Elements gescrollt wird mRecyclerView.getChildAt(0).getTop() gibt auch 0 zurück.

Das Problem

Gibt es sowas RecyclerView.isScrolledToBottom() oder RecyclerView.isScrolledToTop()?

BEARBEITEN: (mRecyclerView.getChildAt(0).getTop() == 0 && linearLayoutManager.findFirstVisibleItemPosition() == 0) Art tut das RecyclerView.isScrolledToTop()aber was ist mit RecyclerView.isScrolledToBottom()?

  • Ich nehme an, letzteres kann erreicht werden, indem die Unterseite der Recyclerview mit dem letzten Kind verglichen wird, dh etwas in der Art von mRecyclerView.getBottom()== linearLayoutmanager.findViewbyPosition(adapter.getItemCount() – 1).getBottom()

    – bescheidener Anfänger

    24. August 2015 um 13:27 Uhr


  • @ Saren Arterius, vielleicht möchten Sie sich das ansehen

    – Sheraz Ahmad Khilji

    4. November 2015 um 7:05 Uhr


Benutzer-Avatar
bescheidener Anfänger

Die Lösung liegt im Layout-Manager.

LinearLayoutManager layoutManager = new LinearLayoutManager(this);

// Add this to your Recycler view
recyclerView.setLayoutManager(layoutManager);

// To check if at the top of recycler view
if(layoutManager.firstCompletelyVisibleItemPosition()==0){
    // Its at top
}

// To check if at the bottom of recycler view
if(layoutManager.lastCompletelyVisibleItemPosition()==data.size()-1){
    // Its at bottom
}

BEARBEITEN

Falls Ihre Artikelgröße größer als der Bildschirm ist, verwenden Sie Folgendes, um das Top-Ereignis zu erkennen.

RecyclerView recyclerView = (RecyclerView) view;
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();

int pos = linearLayoutManager.findFirstVisibleItemPosition();

if(linearLayoutManager.findViewByPosition(pos).getTop()==0 && pos==0){
    return true;
}

PS: Eigentlich, wenn du das platzierst RecyclerView direkt in der SwipeRefreshview Sie müssten dies nicht tun

  • Nein, es passiert immer noch, wenn RecyclerView das direkte untergeordnete Element von SwipeRefreshLayout ist. Das Überprüfen der firstCompletelyVisibleItemPosition behebt das Problem jedoch. Ich muss hier auf etwas hinweisen. Wenn keines der Elemente vollständig sichtbar ist, gibt firstCompletelyVisibleItemPosition() -1 zurück. Diese Lösung funktioniert also nicht, wenn das erste Element nicht in die RecyclerView passt, wenn es nach oben gescrollt wird. Aber es ist eine sehr seltene Situation.

    – eluleci

    31. März 2015 um 10:43 Uhr

  • @eluleci : Prüfen, ob Liste oben ist RecyclerView rc=(RecyclerView)view; LinearLayoutManager lm= (LinearLayoutManager) rc.getLayoutManager(); if(lm.findViewByPosition(lm.findFirstVisibleItemPosition()).getTop()==0 && lm.findFirstVisibleItemPosition()==0) return true; //Dies würde sogar funktionieren, wenn das Element größer als der Bildschirm ist

    – bescheidener Anfänger

    27. April 2015 um 10:03 Uhr


  • Dies würde fehlschlagen, wenn das Element (erstes oder letztes) größer als der gesamte Bildschirm ist. Da, first/lastCompletelyVisibleItemPosition() gibt -1 zurück, impliziert, dass es überhaupt kein vollständig sichtbares Element gibt.

    – C–

    20. August 2015 um 10:49 Uhr

  • Beide lastVisibleItemPosition und lastCompletelyVisibleItemPosition funktionieren nicht. (Methode kann nicht aufgelöst werden). Hilfe?

    – Sternenstaub

    7. Juli 2016 um 22:49 Uhr


  • findLastCompletelyVisibleItemPosition schlägt fehl, wenn die Höhe des letzten Elements größer als die Bildschirmhöhe ist. Das bedeutet, dass das letzte Element zwar sichtbar, aber nicht vollständig sichtbar ist layout.findLastCompletelyVisibleItemPosition()=-1(RecyclerView.NO_POSITION). Verwenden lastVisibleItemPosition und prüfen Sie, ob der untere Rand der letzten Ansicht im Layout sicherer ist.

    – Weg

    29. August 2016 um 5:50 Uhr

Benutzer-Avatar
Penzz

Du kannst es versuchen recyclerView.canScrollVertically(int direction)wenn Sie nur wissen müssen, ob es möglich ist, zu scrollen oder nicht.

Richtungs-Ganzzahlen:

  • -1 für nach oben
  • 1 für unten
  • 0 gibt immer falsch zurück.

  • Dies müsste jedoch in einem Intervall wiederholt werden, oder?

    – Sternenstaub

    7. Juli 2016 um 22:52 Uhr

  • Sie können dies in recyclerView.addOnScrollListener herausfinden … es funktioniert wie ein Zauber … danke

    – theralrashant

    12. September 2016 um 18:34 Uhr

  • Groß! Dies gibt ein falsches zurück, wenn wir das Ende des Scrollens erreichen, ich brauchte dieses Ereignis.

    – Kasten

    25. November 2016 um 14:40 Uhr

  • Exzellent. Verwenden Sie dies in onScrollStateChanged funktioniert bei mir.

    – Lym Zoy

    6. Februar 2017 um 15:49 Uhr

  • Richtungs-Integer: -1 für aufwärts, 1 für abwärts, 0 gibt immer falsch zurück.

    – Grux

    4. September 2017 um 2:34 Uhr


Benutzer-Avatar
Sheraz Ahmad Khilji

Um zu prüfen, ob RecyclerView wird nach unten gescrollt. Verwenden Sie den folgenden Code.

/**
     * Check whether the last item in RecyclerView is being displayed or not
     *
     * @param recyclerView which you would like to check
     * @return true if last position was Visible and false Otherwise
     */
    private boolean isLastItemDisplaying(RecyclerView recyclerView) {
        if (recyclerView.getAdapter().getItemCount() != 0) {
            int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
            if (lastVisibleItemPosition != RecyclerView.NO_POSITION && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1)
                return true;
        }
        return false;
    }

Einige zusätzliche Informationen

Wenn Sie umsetzen möchten ScrollToBottom in RecyclerView Wenn Edittext ist tapped dann empfehle ich Ihnen hinzufügen 1 Sekunde Verzögerung so was:

 edittext.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP)
                    if (isLastItemDisplaying(recyclerView)) {
// The scrolling can happen instantly before keyboard even opens up so to handle that we add 1 second delay to scrolling
                        recyclerView.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount() - 1);

                            }
                        }, 1000);
                    }
                return false;
            }
        });

  • Hat für mich funktioniert. Ich musste es zu RecyclerView hinzufügen addOnScrollListener() obwohl

    – Aphoe

    29. Mai 2016 um 1:13 Uhr


  • Dies funktioniert nicht für den trivialen Fall, in dem sich ein Element in der Recycleransicht befindet und es vollständig sichtbar ist.

    – Techniktüftler

    22. Oktober 2016 um 2:07 Uhr

  • Du hast einen Tag gespart

    – Reena

    8. Februar 2017 um 7:25 Uhr

@ Saren Arterius, Verwenden der addOnScrollListener von RecycleViewfinden Sie das Scrollen oben oder unten in Vertical RecycleView wie unten,

RecyclerView rv = (RecyclerView)findViewById(R.id.rv);

rv.addOnScrollListener(new RecyclerView.OnScrollListener() {

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

                if (dy < 0) {
                    // Recycle view scrolling up...

                } else if (dy > 0) {
                    // Recycle view scrolling down...
                }
            }
        });

Verwenden recyclerView.canScrollVertical(int direction) um zu prüfen, ob das obere oder untere Ende der Schriftrolle erreicht ist.

direction = 1 für nach unten scrollen (unten)

direction = -1 für nach oben scrollen (oben)

Wenn die Methode false zurückgibt, bedeutet dies, dass Sie entweder oben oder unten angekommen sind, abhängig von der Richtung.

Benutzer-Avatar
Xieyi

Behalten Sie einfach einen Verweis auf Ihren LayoutManager bei und setzen Sie onScrollListener in Ihrer Recycler-Ansicht wie folgt

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        visibleItemCount = mRecyclerView.getChildCount();
        totalItemCount = mLayoutManager.getItemCount();
        firstVisibleItemIndex = mLayoutManager.findFirstVisibleItemPosition();

        //synchronizew loading state when item count changes
        if (loading) {
            if (totalItemCount > previousTotal) {
                loading = false;
                previousTotal = totalItemCount;
            }
        }
        if (!loading)
            if ((totalItemCount - visibleItemCount) <= firstVisibleItemIndex) {
                // Loading NOT in progress and end of list has been reached
                // also triggered if not enough items to fill the screen
                // if you start loading
                loading = true;
            } else if (firstVisibleItemIndex == 0){
                // top of list reached
                // if you start loading
                loading = true;
            }
        }
    }
});

Sie können oben erkennen, indem Sie Folgendes verwenden

 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
          }

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            if(isRecyclerViewAtTop())
            {
                //your recycler view reached Top do some thing
             }
        }
    });

  private boolean isRecyclerViewAtTop()   {
        if(recyclerView.getChildCount() == 0)
            return true;
        return recyclerView.getChildAt(0).getTop() == 0;
    }

Dies wird oben erkennen, wenn Sie den Finger loslassen, sobald Sie oben angekommen sind, wenn Sie erkennen möchten, sobald der Recyclerview oben angekommen ist if(isRecyclerViewAtTop()) Innerhalb onScrolled Methode

  • Das scheint falsch zu sein. getChildAt() gibt das erste Kind der zurück ViewGroup, die sich vom ersten Element der Liste unterscheiden könnte (und wird). Wenn dieses Kind perfekt mit der Oberseite der Recycleransicht ausgerichtet ist, ist Ihr IsRecyclerViewAtTop() -Methode gibt true zurück, obwohl sie nicht ganz oben steht.

    – aspykt

    29. Mai 2017 um 9:23 Uhr


1300740cookie-checkWoher wissen, ob ein RecyclerView / LinearLayoutManager nach oben oder unten gescrollt wird?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy