RecyclerView ItemTouchHelper Schaltflächen beim Swipe

8

Ich versuche, einige iOS-Funktionen auf Android zu portieren.

Ich beabsichtige, eine Tabelle zu erstellen, in der beim Streichen nach links die Schaltfläche 2 angezeigt wird: Bearbeiten und Löschen.

Ich habe damit gespielt und ich weiß, dass ich sehr nahe bin. Das Geheimnis liegt wirklich in der Methode OnChildDraw.

Ich möchte ein Rect zeichnen, das zu dem Text Delete passt, und dann den Edit-Text daneben mit der entsprechenden Hintergrundfarbe zeichnen. Der verbleibende Leerraum sollte beim Anklicken die ursprüngliche Position der Zeile wiederherstellen.

Ich habe es geschafft, den Hintergrund zu zeichnen, während der Benutzer zu den Seiten wischt, aber ich weiß nicht, wie man die Listener hinzufügt und sobald es zur Seite gezogen wird, beginnt sich die Drag-Funktion zu verfehlen.

Ich arbeite an Xamarin, aber auch reine Java-Lösungen werden akzeptiert, da ich sie einfach nach c # portieren kann.

%Vor%

Das habe ich derzeit.

Wenn Sie wissen, wie Sie Listener oder Vorschläge hinzufügen, hinterlassen Sie einen Kommentar!

UPDATE:

Ich habe gerade festgestellt, dass beim Doppeltippen auf den weißen Restplatz der Reihe die Reihe bereits in ihren Anfangszustand zurückversetzt wird. Aber kein einziger Tipp: (

    
Gustavo Baiocchi Costa 07.07.2017, 07:44
quelle

4 Antworten

13

Ich habe mit dem gleichen Problem gekämpft und versucht, online eine Lösung zu finden. Die meisten Lösungen verwenden einen Zwei-Ebenen-Ansatz (Ein-Ebenen-Ansichtselement, andere Ebenenschaltflächen), aber ich möchte nur bei ItemTouchHelper bleiben. Am Ende habe ich eine funktionierende Lösung gefunden. Bitte überprüfen Sie unten.

%Vor%

Verwendung:

%Vor%

Hinweis : Diese Hilfsklasse ist für das Streichen mit der linken Maustaste vorgesehen. Sie können die Swipe-Richtung im SwipeHelper -Konstruktor ändern und Änderungen basierend auf dX in der onChildDraw -Methode entsprechend vornehmen.

Wenn Sie das Bild in der Schaltfläche anzeigen möchten, verwenden Sie einfach imageResId in UnderlayButton und implementieren Sie die Methode onDraw erneut .

Es gibt einen bekannten Fehler. Wenn Sie ein Objekt diagonal von einem Objekt zum anderen ziehen, blinkt das erste berührte Objekt ein wenig. Dies könnte behoben werden, indem der Wert von getSwipeVelocityThreshold verringert wird, dies erschwert jedoch dem Benutzer das Streichen des Elements. Sie können das Wischgefühl auch anpassen, indem Sie zwei andere Werte in getSwipeThreshold und getSwipeEscapeVelocity ändern. Überprüfen Sie in den ItemTouchHelper-Quellcode, die Kommentare sind sehr hilfreich.

Ich glaube, es gibt viel Platz für die Optimierung. Diese Lösung bietet nur eine Idee, wenn Sie mit ItemTouchHelper bleiben möchten. Bitte lassen Sie mich wissen, wenn Sie Probleme damit haben. Unten ist ein Screenshot.

Danksagung : Diese Lösung basiert hauptsächlich auf AdamWeis Antwort in diesem posten

    
Wenxi Zeng 12.07.2017 16:06
quelle
0

Wenn Sie RecyclerView verwenden, versuchen Sie OnScrollListener zu verwenden. Mach so etwas.

%Vor%     
Dmitry Smolyaninov 07.07.2017 07:53
quelle
0

Ich wollte diese Touch-Geste auch in meiner App verwenden, nachdem ich zu viel mit Itemtouchhelper gearbeitet hatte, entschied ich mich, meinen eigenen Touch-Handler zu schreiben:

%Vor%

Hinweis: Legen Sie dies als ontouchlistener für den Inhalt Ihres Viewholders fest, wenn das Erstellen des Viewholders durchgeführt wird. Sie können Ihre Animationen hinzufügen, um das Objekt an seinen ersten Platz zurückzubringen.

Sie können auch Ihren benutzerdefinierten Layout-Manager schreiben, um den vertikalen Bildlauf zu blockieren, während das Objekt verschoben wird.

    
Mohammad Omidvar 07.07.2017 08:23
quelle
0

Wenn Sie Wenxi Zeng's Antwort hier folgen möchten, ersetzen Sie UnderlayButtons onDraw, wenn Sie den Text in den Schaltflächen mehrerer Zeilen haben möchten Methode mit diesem:

%Vor%     
Castaldi 19.10.2017 10:01
quelle