wie erkennt man die position des scroll nestedscrollview android unten?

Lesezeit: 4 Minuten

Benutzeravatar von Amay Diam
Amay Diam

Ich möchte nur die Position des Scroll-NestedScrollView-Androids unten und die Funktion zum Aufrufen erkennen. mein Code ist:

scroll.getViewTreeObserver()
      .addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
           @Override
           public void onScrollChanged() {
               int totalHeight = scroll.getChildAt(0).getHeight();
               int scrollY = scroll.getScrollY();
               Log.v("position", "totalHeight=" + totalHeight + "scrollY=" + scrollY);
               if (scrollY==totalHeight) {
                   getPlaylistFromServer("more");
               }
           }
      });

aber die Gesamthöhe ist nicht dasselbe wie bei MAX ScrollY. wie man es repariert ?

  • Verwenden ViewCompat.canScrollVertically(View v, int direction)

    – Nikola Despotoski

    22. März 2016 um 23:40 Uhr

  • Wie ViewCompat.canScrollVertically (View v, int-Richtung) ist veraltet, verwenden View.canScrollVertical(int direction).

    – Ankit Gupta

    10. Mai 2021 um 11:46 Uhr


Benutzeravatar von Codelaby
Codelaby

Satz setOnScrollChangeListener in einem NestedScrollView Parameter zu bekommen

  • NestedScrollView v (übergeordnet mit Bildlauf)
  • int scrollY
  • int oldScrollY

Um zu erkennen, ob der Versatz unten ist, ist es notwendig, den Wert der Inhaltshöhe zu erhalten v.getChildAt(0).getMeasuredHeight() und vergleichen Sie den aktuellen Scroll über die Höhe des übergeordneten, wenn Sie den gleichen Wert haben, bedeutet dies, dass er das Ende erreicht hat.

Sie können die Höhe mit der übergeordneten Ansicht abrufen v.getMeasuredHeight()

NestedScrollView scroller = (NestedScrollView) findViewById(R.id.myScroll);

if (scroller != null) {

    scroller.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
        @Override
        public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {

            if (scrollY > oldScrollY) {
                Log.i(TAG, "Scroll DOWN");
            }
            if (scrollY < oldScrollY) {
                Log.i(TAG, "Scroll UP");
            }

            if (scrollY == 0) {
                Log.i(TAG, "TOP SCROLL");
            }

           if (scrollY == ( v.getMeasuredHeight() - v.getChildAt(0).getMeasuredHeight() )) {
               Log.i(TAG, "BOTTOM SCROLL");
           }
       }
    });
}

  • Wie kann man überprüfen, wann der Benutzer aufgehört hat zu scrollen, als wenn er inaktiv wird?

    – Ala Abu Zarifa

    24. August 2017 um 6:24 Uhr

  • Kann mir jemand erklären, warum diese Zeile funktioniert? if (scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight())) Wie kommt es, dass die NestedScrollViewDie gemessene Höhe von ist kleiner als die Höhe des Inhalts, obwohl die NestedScrollView ist der Elternteil?

    – cooler Typ

    9. März 2018 um 22:59 Uhr


  • min API für diesen Ansatz ist 23, kennen Sie eine andere Alternative?

    – João Carlos

    7. August 2018 um 17:46 Uhr

  • @JoãoCarlos nein das ist nicht von 23 API. setOnScrollChangeListener(View.OnScrollChangeListener) benötigt API 23, aber setOnScrollChangeListener(NestedScrollView.OnScrollChangeListener) nicht

    – grine4ka

    30. April 2020 um 9:56 Uhr

  • Du bist der Held meines Tages, Bruder! Deine Antwort hat mir sehr geholfen. Vielen Dank!

    – Markus Delphi

    2. Oktober 2020 um 19:44 Uhr

Ich weiß, es ist spät, aber … versuchen Sie es so.

scroll.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
    @Override
    public void onScrollChanged() {
            View view = (View) scroll.getChildAt(scroll.getChildCount() - 1);

            int diff = (view.getBottom() - (scroll.getHeight() + scroll
                    .getScrollY()));

            if (diff == 0) {
                getPlaylistFromServer("more");
            }          
    }
});

Viel Spaß beim Codieren..

  • Vielen Dank. Es rettet meinen Tag.

    – Mahmudur Rahman

    14. Januar 2020 um 10:50 Uhr

  • Wenn Sie eine Recycleransicht in der verschachtelten Bildlaufansicht haben. Bitte beziehen Sie sich darauf.

    – Abhinav Upadhyay

    2. März 2020 um 10:42 Uhr

  • Woher weiß ich, dass der Benutzer das erste Element nach oben gescrollt hat? Bitte helfen Sie dabei

    – Gyan Swaroop Awasthi

    19. September um 11:17 Uhr

Benutzeravatar von Wai Yan
Wai Yan

Webservis hat richtig geantwortet, aber es braucht ein paar Änderungen in onScrollChange (Überschreibungsmethode), wie folgt:

if (scrollY === v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight()) {
   // end of the scroll view
}

Kotlin:

if (scrollY == v.getChildAt(0).measuredHeight - v.measuredHeight) {
    // end of the scroll view
}

  @Override
public void onScrollChange(NestedScrollView nestedScrollView, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
    if (nestedScrollView.getChildAt(nestedScrollView.getChildCount() - 1) != null) {
        if ((scrollY >= (nestedScrollView.getChildAt(nestedScrollView.getChildCount() - 1).getMeasuredHeight() - nestedScrollView.getMeasuredHeight())) &&
                scrollY > oldScrollY) {
            LogsUtils.INSTANCE.makeLogD(">onScrollChange>", ">>BOTTOm");
        }

    }
}

Es hat für mich funktioniert, Quelle

Benutzeravatar von Mrudul Tora
Mrudul Tora

Das hat bei mir funktioniert:

nestedScroll.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
        @Override
        public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {

            if (v.getChildAt(0).getBottom()<=(nestedScroll.getHeight()+scrollY)) {
                System.out.println("End of NestedScrollView");
            }

        }
    });

Grundsätzlich fügen wir viele Ansichten in eine verschachtelteScrollView ein, packen sie aber in Form einer Einzelansicht zusammen. Daher ist childCount immer 1 mit seinem Index 0. Daher verwendet v.getChildAt(0).getBottom() seinen Tiefpunkt zu bestimmen. Jetzt, nestedScroll.getHeight() gibt die Höhe in Pixel zurück, und , scrollY gibt den aktuellen vertikalen Ursprung zurück. Daher ist die obige Bedingung jedes Mal wahr, wenn der untere Rand von NestedScrollView erreicht wird.

if (v.getChildAt(0).getBottom()==(nestedScroll.getHeight()+nestedScroll.getScrollY()))

Dies funktioniert nur einige Zeit … verwenden Sie es daher nicht auf diese Weise.

Benutzeravatar von martinseal1987
martinseal1987

Für api <23 können Sie einen treeObserver.scrollChangeLister hinzufügen, eine lokale Float-Variable speichern und prüfen, in welche Richtung Ihr Scrollen so erfolgt

Beispiel

public class About extends AppCompatActivity implements 
ViewTreeObserver.OnScrollChangedListener{

private float viewScrolled = 0;

   nestedScrollView.getViewTreeObserver().addOnScrollChangedListener(this);

}

@Override
public void onScrollChanged() {

    if (viewScrolled < nestedScrollView.getScrollY()){
        viewScrolled = nestedScrollView.getScrollY();
        Log.d(TAG, "scrolling up");
    }
    if (viewScrolled > nestedScrollView.getScrollY()){
        viewScrolled = nestedScrollView.getScrollY();
        Log.d(TAG, "scrolling down");
    }
}

Benutzeravatar von sandeep dhami
sandeep dhami

Webserver hat richtig geantwortet, aber die Bedingung sollte so sein

 if (scrollY == (v?.getChildAt(0)?.measuredHeight ?: 0) - (v?.measuredHeight ?: 0)) {
    //at bottom
    }

1435970cookie-checkwie erkennt man die position des scroll nestedscrollview android unten?

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

Privacy policy