Kann ich herausfinden, ob meine ListView nach unten gescrollt ist? Damit meine ich, dass der letzte Punkt vollständig sichtbar ist.
105
Bearbeitet :
Da ich mich in einer meiner Bewerbungen mit diesem speziellen Thema befasst habe, kann ich eine erweiterte Antwort für zukünftige Leser dieser Frage schreiben.
Implementieren Sie eine OnScrollListener
, stellen Sie Ihre ListView
ein onScrollListener
und dann sollten Sie in der Lage sein, die Dinge richtig zu handhaben.
Beispielsweise:
private int preLast;
// Initialization stuff.
yourListView.setOnScrollListener(this);
// ... ... ...
@Override
public void onScroll(AbsListView lw, final int firstVisibleItem,
final int visibleItemCount, final int totalItemCount)
{
switch(lw.getId())
{
case R.id.your_list_id:
// Make your calculation stuff here. You have all your
// needed info from the parameters of this function.
// Sample calculation to determine if the last
// item is fully visible.
final int lastItem = firstVisibleItem + visibleItemCount;
if(lastItem == totalItemCount)
{
if(preLast!=lastItem)
{
//to avoid multiple calls for last item
Log.d("Last", "Last");
preLast = lastItem;
}
}
}
}
listview
iststackFromBottom
? Ich habe es versucht,if (0 == firstVisibleItem){//listviewtop}
aber das wird immer wieder aufgerufen.Späte Antwort, aber wenn Sie einfach überprüfen möchten, ob Ihre ListView ganz nach unten gescrollt ist oder nicht, ohne einen Ereignis-Listener zu erstellen, können Sie diese if-Anweisung verwenden:
Zunächst wird geprüft, ob die zuletzt mögliche Position sichtbar ist. Anschließend wird überprüft, ob der untere Rand der letzten Schaltfläche mit dem unteren Rand der ListView übereinstimmt. Sie können etwas Ähnliches tun, um zu wissen, ob es ganz oben ist:
quelle
getChildCount()
die Ansichten in der Ansichtsgruppe werden zurückgegeben, was beim Ansichtsrecycling nicht mit der Anzahl der Elemente im Adapter übereinstimmt. Da ListView jedoch von AdapterView abstammt, können Sie esgetCount()
direkt in ListView verwenden.So wie ich es gemacht habe:
quelle
Etwas zu bewirken von:
quelle
Das hat bei mir funktioniert.
quelle
Das kann sein
quelle
Es war ziemlich schmerzhaft, mit dem Scrollen umzugehen, zu erkennen, wann es fertig ist, und es befindet sich tatsächlich am Ende der Liste (nicht am unteren Rand des sichtbaren Bildschirms) und löst meinen Dienst nur einmal aus, um Daten aus dem Web abzurufen. Allerdings funktioniert es jetzt gut. Der Code lautet wie folgt für alle, die sich der gleichen Situation gegenübersehen.
HINWEIS: Ich musste meinen adapterbezogenen Code in onViewCreated anstelle von onCreate verschieben und das Scrollen hauptsächlich so erkennen:
Hier ist RideListSimpleCursorAdapter.REACHED_THE_END eine zusätzliche Variable in meinem SimpleCustomAdapter, die wie folgt festgelegt ist:
Nur wenn beide Bedingungen erfüllt sind, bedeutet dies, dass ich tatsächlich ganz unten auf der Liste stehe und mein Dienst nur einmal ausgeführt wird. Wenn ich REACHED_THE_END nicht abfange, wird der Dienst auch beim Zurückblättern erneut ausgelöst, solange das letzte Element angezeigt wird.
quelle
canScrollVertically(int direction)
funktioniert für alle Ansichten und scheint das zu tun, was Sie gefragt haben, mit weniger Code als die meisten anderen Antworten. Geben Sie eine positive Zahl ein, und wenn das Ergebnis falsch ist, sind Sie ganz unten.dh:
if (!yourView.canScrollVertically(1)) { //you've reached bottom }
quelle
Um eine der oben genannten Antworten ein wenig zu erweitern, musste ich Folgendes tun, damit sie vollständig funktioniert. In ListViews scheint ein integrierter Abstand von ca. 6 dp vorhanden zu sein, und onScroll () wurde aufgerufen, als die Liste leer war. Dies behandelt beide Dinge. Es könnte wahrscheinlich ein bisschen optimiert werden, ist aber aus Gründen der Klarheit mehr geschrieben.
Randnotiz: Ich habe verschiedene Konvertierungstechniken von dp zu Pixel ausprobiert, und diese dp2px () war die beste.
quelle
Ich kann noch keinen Kommentar abgeben, weil ich nicht genug Ruf habe, aber in der Antwort von @Ali Imran und @Wroclai denke ich, dass etwas fehlt. Mit diesem Code wird das Protokoll nach dem Aktualisieren von preLast nie wieder ausgeführt. In meinem speziellen Problem möchte ich jedes Mal, wenn ich nach unten scrolle, eine Operation ausführen. Sobald preLast jedoch auf LastItem aktualisiert wurde, wird diese Operation nie wieder ausgeführt.
}}
Mit diesem "else" können Sie jetzt Ihren Code (in diesem Fall Log) jedes Mal ausführen, wenn Sie erneut nach unten scrollen.
quelle
quelle
Wenn Ihre Liste aufgerufen wird, wenn die Liste das letzte Mal erreicht ist und ein Fehler auftritt, wird die Endoflist-Ansicht nicht erneut aufgerufen . Dieser Code hilft auch in diesem Szenario.
Dabei kann LIST_UP_THRESHOLD_VALUE ein beliebiger ganzzahliger Wert sein (ich habe 5 verwendet), bei dem Ihre Liste nach oben gescrollt wird. Wenn Sie zum Ende zurückkehren, wird das Ende der Listenansicht erneut aufgerufen.
quelle
Ich habe eine sehr gute Möglichkeit gefunden, das nächste Seitenset automatisch so zu laden, dass es kein eigenes erfordert
ScrollView
(wie es die akzeptierte Antwort erfordert).In ParseQueryAdapter gibt es eine Methode namens
getNextPageView
, mit der Sie Ihre eigene benutzerdefinierte Ansicht bereitstellen können, die am Ende der Liste angezeigt wird, wenn mehr Daten geladen werden müssen, sodass sie erst ausgelöst wird, wenn Sie das Ende Ihres aktuellen Seitensatzes erreicht haben (Dies ist standardmäßig die Ansicht "Mehr laden ..."). Diese Methode wird nur aufgerufen, wenn mehr Daten geladen werden müssen. Daher ist dies ein großartiger Ort zum Aufrufen. AufloadNextPage();
diese Weise erledigt der Adapter die ganze harte Arbeit für Sie, um zu bestimmen, wann neue Daten geladen werden sollen, und wird bei Bedarf überhaupt nicht aufgerufen hat das Ende des Datensatzes erreicht.Dann müssen Sie in Ihrer Aktivität / Ihrem Fragment nur noch den Adapter einstellen, und neue Daten werden automatisch wie von Zauberhand für Sie aktualisiert.
quelle
Um festzustellen, ob das letzte Element vollständig sichtbar ist , können Sie einfach eine Berechnung am unteren sichtbaren Element der Ansicht unten hinzufügen
lastItem.getBottom()
.quelle
Ich ging mit:
quelle
In der Methode
getView()
(einerBaseAdapter
abgeleiteten Klasse) kann überprüft werden, ob die Position der aktuellen Ansicht der Liste der Elemente in der entsprichtAdapter
. Wenn dies der Fall ist, bedeutet dies, dass wir das Ende / Ende der Liste erreicht haben:quelle
Ich finde einen besseren Weg, um das Bildlaufende der Listenansicht unten zu erkennen. Erkennen Sie zuerst das Ende des Bildlaufs durch diese
Implementierung von onScrollListener, um das Ende des Bildlaufs in einer Listenansicht zu erkennen
Kombiniere endlich Martijns Antwort
quelle
Vielen Dank an die Poster im Stackoverflow! Ich habe einige Ideen kombiniert und einen Klassen-Listener für Aktivitäten und Fragmente erstellt (daher ist dieser Code wiederverwendbarer, sodass Code schneller geschrieben und viel sauberer wird).
Alles, was Sie tun müssen, wenn Sie meine Klasse erhalten haben, ist, die in meiner Klasse deklarierte Schnittstelle (und natürlich die Erstellungsmethode dafür) zu implementieren und ein Objekt dieser Klasse zu erstellen, das Argumente übergibt.
quelle
Sie müssen Ihrer listView eine leere XML-Fußzeilenressource hinzufügen und feststellen, ob diese Fußzeile sichtbar ist.
Dann tun Sie dies in Ihrem listView-Scroll-Listener
quelle
Wenn Sie ein Tag für eine Ansicht des letzten Elements der Listenansicht festlegen, können Sie später die Ansicht mit dem Tag abrufen. Wenn die Ansicht null ist, liegt dies daran, dass die Ansicht nicht mehr geladen wird. So was:
dann, wenn Sie wissen müssen, ob der letzte Artikel geladen ist
quelle
Janwilx72 ist richtig, aber es ist min sdk ist 21, also erstelle ich diese Methode:
für ScrollOrientation:
Vielleicht spät, nur für Spätankömmlinge。
quelle
Wenn Sie einen benutzerdefinierten Adapter mit Ihrer Listenansicht verwenden (die meisten Leute tun dies!), Wird hier eine schöne Lösung angegeben!
https://stackoverflow.com/a/55350409/1845404
Die getView-Methode des Adapters erkennt, wenn die Liste zum letzten Element gescrollt wurde. Außerdem werden Korrekturen für die seltenen Fälle hinzugefügt, in denen eine frühere Position aufgerufen wird, selbst nachdem der Adapter die letzte Ansicht bereits gerendert hat.
quelle
Ich habe das gemacht und arbeite für mich:
quelle
Dadurch wird Ihre Liste bis zum letzten Eintrag nach unten gescrollt.
quelle