Ich habe eine Liste von Datensätzen in einer Listenansicht, die der Benutzer per Drag & Drop neu sortieren kann. Ich habe dies in anderen Apps implementiert gesehen, aber ich habe kein Tutorial dafür gefunden. Es muss etwas sein, das auch andere brauchen. Kann mich jemand auf einen Code dafür verweisen?
132
Antworten:
Daran arbeite ich schon seit einiger Zeit. Es ist schwierig, es richtig zu machen, und ich behaupte nicht, dass ich es tue, aber ich bin bisher damit zufrieden. Mein Code und mehrere Demos finden Sie unter
Seine Verwendung ist dem TouchInterceptor (auf dem der Code basiert) sehr ähnlich, obwohl wesentliche Änderungen an der Implementierung vorgenommen wurden.
DragSortListView bietet einen reibungslosen und vorhersehbaren Bildlauf beim Ziehen und Mischen von Elementen. Das Mischen von Elementen stimmt viel besser mit der Position des ziehenden / schwebenden Elements überein. Listenelemente mit heterogener Höhe werden unterstützt. Das Drag-Scrolling ist anpassbar (ich demonstriere das schnelle Drag-Scrollen durch eine lange Liste - nicht, dass mir eine Anwendung in den Sinn kommt). Kopf- / Fußzeilen werden respektiert. etc.?? Schau mal.
quelle
Jetzt ist es
RecyclerView
mit ItemTouchHelper ziemlich einfach zu implementieren . Überschreiben Sie einfach dieonMove
Methode vonItemTouchHelper.Callback
:Ein ziemlich gutes Tutorial dazu finden Sie auf medium.com: Drag & Swipe mit RecyclerView
quelle
Füge diese Antwort zum Zweck derer hinzu, die darüber googeln.
Vor kurzem gab es eine Episode von DevBytes ( ListView Cell Dragging and Rearranging ), in der erklärt wird, wie das geht
Sie finden es hier auch den Beispielcode finden Sie hier .
Was dieser Code im Grunde tut, ist, dass er eine
dynamic listview
durch die Erweiterung von erstelltlistview
, die das Ziehen und Austauschen von Zellen unterstützt. Damit Sie dasDynamicListView
anstelle Ihres Basic verwenden könnenListView
und das ist es, haben Sie eine ListView mit Drag & Drop implementiert.quelle
Die DragListView-Bibliothek macht dies wirklich ordentlich mit sehr guter Unterstützung für benutzerdefinierte Animationen wie Höhenanimationen. Es wird auch weiterhin regelmäßig gewartet und aktualisiert.
So verwenden Sie es:
1: Fügen Sie die Bibliothek hinzu, um zuerst zu gradeln
2: Liste aus XML hinzufügen
3: Stellen Sie den Drag Listener ein
4: Erstellen Sie einen Adapter, der von DragItemAdapter überschrieben wird
5: Implementieren Sie einen Ansichtshalter, der sich von DragItemAdapter.ViewHolder aus erstreckt
Weitere Informationen finden Sie unter https://github.com/woxblom/DragListView
quelle
Ich fand, dass DragSortListView gut funktioniert hat, obwohl der Einstieg einfacher hätte sein können. Hier ist ein kurzes Tutorial zur Verwendung in Android Studio mit einer In-Memory-Liste:
Fügen Sie dies zu den
build.gradle
Abhängigkeiten für Ihre App hinzu:Erstellen Sie eine Ressource für die Drag-Handle-ID, indem Sie Folgendes erstellen oder hinzufügen
values/ids.xml
:Erstellen Sie ein Layout für ein Listenelement, das Ihr bevorzugtes Drag-Handle-Bild enthält, und weisen Sie seine ID der ID zu, die Sie in Schritt 2 erstellt haben (z
drag_handle
. B. ).Erstellen Sie ein DragSortListView-Layout, ungefähr so:
Legen Sie eine
ArrayAdapter
Ableitung mit einergetView
Überschreibung fest, die Ihre Listenelementansicht darstellt.Legen Sie einen Drop-Listener fest, der die Elemente beim Ablegen neu anordnet.
quelle
Ich bin kürzlich auf diesen großartigen Kern gestoßen , der eine funktionierende Implementierung einer Drag-Sortierung
ListView
bietet, ohne dass externe Abhängigkeiten erforderlich sind.Grundsätzlich besteht es darin, einen benutzerdefinierten Adapter zu erstellen, der sich
ArrayAdapter
als innere Klasse auf die Aktivität erstreckt, die Ihren enthältListView
. Auf diesem Adapter setzt man dann einenonTouchListener
auf Ihre Listenelemente, der den Beginn des Ziehens signalisiert.In diesem Gist setzen sie den Listener auf einen bestimmten Teil des Layouts des Listenelements (das "Handle" des Elements), sodass man es nicht versehentlich bewegt, indem man einen Teil davon drückt. Persönlich habe ich es vorgezogen, stattdessen mit einem zu gehen
onLongClickListener
, aber es liegt an Ihnen, zu entscheiden. Hier ein Auszug aus diesem Teil:Dazu gehört auch das Hinzufügen eines
onTouchListener
zuListView
, das prüft, ob ein Element gezogen wird, das Austauschen und die Ungültigmachung behandelt und den Ziehstatus stoppt. Ein Auszug aus diesem Teil:Abschließend sehen Sie, wie die Methoden
stopDrag
undstartDrag
aussehen, die das Aktivieren und Deaktivieren des Ziehvorgangs behandeln:quelle