wie erkennt man die position des scroll nestedscrollview android unten?
Lesezeit: 4 Minuten
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
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.
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.
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");
}
}
sandeep dhami
Webserver hat richtig geantwortet, aber die Bedingung sollte so sein
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