Wie bekomme ich die Scrollgeschwindigkeit auf einem ListView?
Ich habe eine ListView mit onScrollStateChanged und onScroll-Ereignis-Listener. Ich möchte in der Lage sein, um die scroll-Geschwindigkeit der ListView, oder einige Weg, um die finalX Lage der eingeleiteten Blättern in einem Ereignis-listener. Unsere app Ziele SDK-version 7.
Brauche ich, um zu Messen oder die Geschwindigkeit, mit der die ListView gescrollt wird.
Kommentar zu dem Problem
Ich habe nicht versucht, alles noch, aber zwei Ideen in den Sinn kommen. 1) Verwenden Sie ein GestureDetector zu erkennen, die Geschwindigkeit der Geste mit der
onFling()
- Methode. 2) Anrufe Tätigen, um listView.getFirstVisiblePosition()
verfolgen Sie die Zeit an, die jeder Anruf wird für die Berechnung der velocity. @theisenp Scheint, sowohl vernünftige Optionen ich werde in Ihnen.
Sie könnten versuchen, zu verwenden Scroller developer.android.com/reference/android/widget/Scroller.html Nicht sicher, ob nur eine zufällige Idee.
@renam.antunes habe ich einen Blick auf Scroller, aber ich bin mir nicht sicher, wie es zu benutzen.
Ich recherchierte ein wenig über dein problem und ich denke, dass diese Lösung Ihnen helfen kann: stackoverflow.com/questions/3948934/... Es ist keine gute Lösung und kann brechen in der Zukunft, aber ich denke, dass es die beste, die Sie haben. onScrollChanged ist aufgerufen, aus computeScroll die aufgerufen wird, wenn die Eltern sagen, der scrollView das malen selbst.
InformationsquelleAutor der Frage Joost | 2011-10-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Division erste sichtbare Elemente Unterschied, Zeitunterschied, ist keine gute Lösung. OnScroll-listener erhält onScroll event jeden festen Zeitraum, so dass in den meisten Fällen das Ergebnis der division wird auf "0".
So können Sie versuchen, so etwas wie dieses:
InformationsquelleAutor der Antwort SSemashko
Probieren Sie es aus:
InformationsquelleAutor der Antwort QuickNick
So ist dies nur einige theoretische pseudo-code, aber nicht so etwas wie diese Arbeit?
Ich denke, die akzeptierten Antworten funktioniert nicht wirklich, die Auflösung ist super gering (d.h. man bekommt nur eine Geschwindigkeit, nachdem ein Objekt ein Bildlauf durchgeführt wurde aus den gesamten Bildschirm, aber was ist, wenn Sie große items?).
Wieder das ist nur pseudo-code, habe ich noch nicht getestet, aber ich denke, es sollte funktionieren. Sie haben auch das zurücksetzen der letzten Zeit und die top-position der Werte, wenn die Rollen-Zustand ist
STATE_IDLE
.InformationsquelleAutor der Antwort rharter
Gibt es einen einfachen Weg, um Holen Sie sich die Geschwindigkeit (NICHT Geschwindigkeit) der ListView, aber es ist nicht der perfekte Weg.
onScroll
,in AbsListView, können wir die Geschwindigkeit mit FlingRunnable#mScroller.getCurrVelocity(), aber leider,dieAbsListView
bieten nicht die öffentliche Methode vongetCurrVelocity()
, also, wenn wir wollen, Holen Sie diese Methode, es gibt zwei Methoden, um es zu bekommenonScroll
RückrufgetCurrVelocity()
in dieser Klasse, lassen neue ListViewEx erstreckt sich von AbsListViewEx, aber es hat auch einige Probleme: 1) es ist vielleicht eine komplizierte Sache 2) die ListViewEx kann die Kompatibilität problem. Jedoch, diese Art, wie ich denke, ist besser alsReflect method
.InformationsquelleAutor der Antwort Autobots
Hier ist der code, wenn Sie brauchen, um zu wissen, wie viele Pixel pro Sekunde scrollen, wenn die Elemente haben unterschiedliche Größen, oder wenn Sie eine sehr lange Liste. Die Berechnung und Zwischenspeicherung jedes Element Größe würde nicht funktionieren, wenn einige Elemente fehlen. BTW, wenn Sie wählen Sie diese Methode, sollten Sie den cache der item offset statt der Höhe, so dass Sie nicht haben, um so viele Berechnung.
Überschreiben OnScrollListener:
InformationsquelleAutor der Antwort Dalton Tan
können Sie
android:fastScrollEnabled="true"
in Sieund nicht vergessen :
YourListView.requestFocusFromTouch();
nachyourAdapter.notifyDataSetChanged();
weil es (yourlistview) verlieren den Fokus, die in hoher GeschwindigkeitInformationsquelleAutor der Antwort Angie