2016-02-04 8 views
13

Recyclerview hat jetzt 3 Zustände.Unterscheiden Sie zwischen einer Drag-Aktion und einer Fling-Aktion in der Recycler-Ansicht

SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING

Ein issue für denselben hob eine fling enthalten state.I kann nicht feststellen, ob etwas getan wurde in Bezug auf diese.

Gibt es eine Möglichkeit, in Recyclerview zwischen einem Drag und einem Fling zu unterscheiden.

EDIT: Voraussetzung für eine solche Funktionalität: Wenn der Benutzer schleudert, ich will das Laden von Bildern zu unterbrechen können (alle Bilder sind URL-Anforderungen) in den Recycler Ansicht und wieder auf, sobald er ein Element von Interesse erreicht, Dadurch wird sichergestellt, dass das Bild, das er gerade betrachtet, vor den anderen geladen wird.

+0

Soweit ich aus der Ausgabe und dem aktuellen Quellcode sagen könnte, gibt es keine einfache Möglichkeit, es zu tun. Es gibt jedoch Alternativen. Was versuchst du zu erreichen? –

+0

dass insgesamt ein wirklich lange reason.but würde ich brauche einen Prozess, auf dem aktuellen Element auszuführen, nachdem der Benutzer durch schleudert. – Droidekas

+0

Wenn der Benutzer was schleudert? Einer der Artikel? Die Recycler-Ansicht nach unten oder oben? Wischt er einen Gegenstand weg, als würde er ihn verwerfen? Was passiert auf der Benutzeroberfläche, um zu zeigen, dass der Benutzer einen Fling gemacht hat, abgesehen von dem Beenden des Ladens von Bildern? –

Antwort

6

SCROLL_STATE_FLING: Nein länger ein Teil von RecyclerView, da es nicht in documentation here

in Bezug auf Ihre Anforderung erwähnt wird:

RecyclerView ist innerhalb android.view.ViewGroup und nach seinem Quellcode es extends ViewGroupdocumentation here.

Das Scrollen in einem RecyclerView ist eine Art Aufteilung zwischen dem RecyclerView und dem LinearLayoutManager. Es gibt zwei Fälle, die behandelt werden müssen:

  1. Der Benutzer schleudert die Ansicht. Das Standardverhalten ist, dass das RecyclerView den Fling an einen internen Scroller weiterleitet, der dann die Scroll-Magie ausführt. Dies ist problematisch, da sich der RecyclerView in der Regel in einer nicht erfassten Position befindet. Lösen Sie dies, indem Sie die RecyclerView-Implementierung fling() und anstelle von flinging, smoothscroll die LinearLayoutManager in eine Position überschreiben.
  2. Der Benutzer hebt den Finger mit zu geringer Geschwindigkeit an, um eine Rolle einzuleiten. In diesem Fall tritt kein Schleudern auf. Wenn Sie diesen Fall für den Fall erfassen möchten, dass sich die Ansicht nicht in einer eingerasteten Position befindet, können Sie dies tun, indem Sie die Methode onTouchEvent überschreiben.

Sehen Sie hier für Detail Snappy scrolling in RecyclerView

Einige ViewPager Hinweise, die als RecyclerView erwähnenswert sind, ist ein Kind davon:

  1. zum Ändern der Anzahl der Seiten denken, dass zwischengespeichert werden. Dies ist besonders wichtig, wenn Sie nur 3 oder 4 Seiten haben. In der Standardeinstellung wird 1 Seite von jeder Seite der aktuellen Seite gespeichert. In dem Szenario, in dem Sie drei Seiten haben, bedeutet das Wischen auf die mittlere Seite, dass alle Ihre Seiten zwischengespeichert werden. Wenn Sie dann zur ersten oder letzten Seite wischen, wird eine der Seiten aus dem Speicher gelöscht. Sie müssen neu erstellt und erneut hinzugefügt werden, wenn Sie erneut zurückwischen.Mit der Einstellung setOffscreenPageLimit(2) können Sie alle Ihre Seiten dauerhaft im Speicher behalten. Dies ist ein Kompromiss zwischen Leistung und Speicherüberlegungen. Es ist daher eine gute Idee, auf Warnungen bei niedrigem Speicher zu warten und darauf vorbereitet zu sein, Kantenseiten bei Bedarf zu entfernen.

  2. Wenn Sie versuchen, Ansichten in Ihrem ViewPager zu ersetzen, reicht es nicht, nur den Datensatz hinter dem Adapter zu ändern und notifyDataSetChanged() aufzurufen. Sie müssen auch sicherstellen, dass Sie richtig getItemPosition(Object object) und zurück POSITION_NONE für Elemente implementiert haben, die geändert wurden und das Rück POSITION_UNCHANGED oder die aktuelle Position für Elemente, die sich nicht verändert haben.

  3. Eine weitere API, die hinzugefügt wurde, ist setPageMargin() und setPageMarginDrawable(), so dass Sie Ihre Seiten leicht trennen können.

Sehen Sie hier für Detail Horizontal View Swiping with ViewPager, Updated

Unterschied zwischen einem Drag und einem Fling

Für Drag Funktion Sie einige der RecyclerView's Begleiter Klassen verwenden:

  1. ItemTouchHelper, die eine ut ist ility Klasse Swipe hinzufügen & Drop-Unterstützung zu RecyclerView entlassen und ziehen.

  2. seine ItemTouchHelper.Callback, die der Vertrag zwischen ItemTouchHelper ist und Ihre Anwendung

Für fling Sie

  1. Android fling actions on a RecyclerView

  2. Android : Control Smooth scroll over recycler view

  3. sehen
+0

Der Dragfeature-Teil scheint hier relevant zu sein, aber dies scheint immer noch wie ein Hack zu sein, indem ein einzelner Item-Listener verwendet wird, der für andere Zwecke gedacht ist. – Droidekas

+0

@Droidekas, Bis es keine feste Lösung gibt, denke ich, dass Arbeit besser ist. – Tauqir

3

Ich benutze eine Kombination von SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING dies zu tun: hier ist mein Code:

@Override 
      public void onScrollStateChanged(int newState) { 
       if (newState == RecyclerView.SCROLL_STATE_DRAGGING || newState == RecyclerView.SCROLL_STATE_SETTLING) { 
        if (mAdapter != null) 
         mAdapter.pauseImageLoading(); 
       } else if (newState == RecyclerView.SCROLL_STATE_IDLE) { 
        if (mAdapter != null) 
         mAdapter.resumeImageLoading(); 
       } 

das funktioniert für mich gleich wie Sie es, wenn der Benutzer Stopp am Element von Interesse fortsetzen möchten

+0

Ich versuchte dies, es funktioniert nicht in dem Fall: Sie stoppen die Rolle plötzlich, das Element, das Sie auf laden nicht, weil diese Anfrage als Teil der Rolle abgelehnt wurde – Droidekas

+0

es funktioniert für mich, bitte senden Sie mir Ihren Code –

1

Ihr Problem möglicherweise auf eine andere Weise gelöst werden könnte. Sie könnten versuchen, Ihre Anforderungen um ein paar hundert Millisekunden zu verschieben (die genaue Anzahl müsste angepasst werden). Wenn der Listeneintrag innerhalb dieser Millisekunden außerhalb des Bildschirms verschoben wird, können Sie die Anfrage vor dem Senden abbrechen. Die Idee ist, dass die Ansichten beim Scrollen so schnell vom Bildschirm ablaufen, dass Anfragen immer vor dem Senden abgebrochen werden. Wenn sie nicht schleudern, sind diese zusätzlichen Millisekunden pro Anfrage hoffentlich keine schlechte Erfahrung.

Verwandte Themen