Ich habe eine Liste von Datensätzen in einer Listenansicht, die ich möchte, dass der Benutzer in der Lage, neu zu sortieren mit einer Drag & Drop-Methode sein. Ich habe gesehen, dass dies in anderen Anwendungen implementiert ist, aber ich habe keine Anleitung dafür gefunden. Es muss etwas sein, das auch andere brauchen. Kann mir jemand einen Hinweis auf einen Code geben, der dies ermöglicht?
Antworten
Zu viele Anzeigen?Daran arbeite ich nun schon seit einiger Zeit. Es ist schwer, es richtig hinzubekommen, und ich behaupte nicht, dass ich es kann, aber ich bin bisher zufrieden damit. Meinen Code und mehrere Demos finden Sie unter
Seine Verwendung ist dem TouchInterceptor (auf dem der Code basiert) sehr ähnlich, obwohl bedeutsam Änderungen bei der Umsetzung wurden vorgenommen.
DragSortListView bietet einen reibungslosen und vorhersehbaren Bildlauf beim Ziehen und Mischen von Elementen. Die Umordnung von Elementen ist viel konsistenter mit der Position des ziehenden/schwebenden Elements. Listenelemente mit heterogener Höhe werden unterstützt. Drag-Scrolling ist anpassbar (ich demonstriere schnelles Drag-Scrolling durch eine lange Liste - nicht dass mir eine Anwendung einfällt). Kopf-/Fußzeilen werden berücksichtigt. etc. Werfen Sie einen Blick darauf.
Jetzt ist es ziemlich einfach zu implementieren für RecyclerView
con ItemTouchHelper . Einfach außer Kraft setzen onMove
Methode von ItemTouchHelper.Callback
:
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
mMovieAdapter.swap(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
Eine ziemlich gute Anleitung dazu findet sich auf medium.com: Ziehen und Streichen mit RecyclerView
Ich füge diese Antwort für diejenigen hinzu, die nach diesem Thema googeln.
Es gab eine Folge von DevBytes ( ListView-Zellen ziehen und neu anordnen ), in dem erklärt wird, wie man das macht
Sie können es finden aquí Auch der Beispielcode ist verfügbar aquí .
Dieser Code erstellt im Wesentlichen eine dynamic listview
durch die Erweiterung von listview
die das Ziehen und Vertauschen von Zellen unterstützt. So können Sie die DynamicListView
anstelle der einfachen ListView
und schon haben Sie eine ListView mit Drag and Drop implementiert.
Die DragListView Lib macht dies wirklich ordentlich mit sehr schöner Unterstützung für benutzerdefinierte Animationen wie Elevation Animationen. Es ist auch noch gepflegt und regelmäßig aktualisiert.
So verwenden Sie es:
1: Fügen Sie die Bibliothek zuerst zu gradle hinzu
dependencies {
compile 'com.github.woxthebox:draglistview:1.2.1'
}
2: Liste aus xml hinzufügen
<com.woxthebox.draglistview.DragListView
android:id="@+id/draglistview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
3: Den Drag-Listener einstellen
mDragListView.setDragListListener(new DragListView.DragListListener() {
@Override
public void onItemDragStarted(int position) {
}
@Override
public void onItemDragEnded(int fromPosition, int toPosition) {
}
});
4: Erstellen Sie einen Adapter, der von DragItemAdapter überschrieben wird
public class ItemAdapter extends DragItemAdapter<Pair<Long, String>, ItemAdapter.ViewHolder>
public ItemAdapter(ArrayList<Pair<Long, String>> list, int layoutId, int grabHandleId, boolean dragOnLongPress) {
super(dragOnLongPress);
mLayoutId = layoutId;
mGrabHandleId = grabHandleId;
setHasStableIds(true);
setItemList(list);
}
5: Implementieren Sie einen Viewholder, der sich von DragItemAdapter.ViewHolder
public class ViewHolder extends DragItemAdapter.ViewHolder {
public TextView mText;
public ViewHolder(final View itemView) {
super(itemView, mGrabHandleId);
mText = (TextView) itemView.findViewById(R.id.text);
}
@Override
public void onItemClicked(View view) {
}
@Override
public boolean onItemLongClicked(View view) {
return true;
}
}
Ausführlichere Informationen finden Sie unter https://github.com/woxblom/DragListView
Ich fand DragSortListView hat gut funktioniert, obwohl der Einstieg einfacher hätte sein können. Hier ist eine kurze Anleitung zur Verwendung in Android Studio mit einer speicherinternen Liste:
-
Fügen Sie dies dem
build.gradle
Abhängigkeiten für Ihre Anwendung:compile 'asia.ivity.android:drag-sort-listview:1.0' // Corresponds to release 0.6.1
-
Erstellen Sie eine Ressource für die ID des Ziehgriffs, indem Sie eine Ressource erstellen oder zu
values/ids.xml
:<resources> ... possibly other resources ... <item type="id" name="drag_handle" /> </resources>
-
Erstellen Sie ein Layout für ein Listenelement, das Ihr bevorzugtes Bild für den Ziehgriff enthält, und weisen Sie dessen ID der in Schritt 2 erstellten ID zu (z. B.
drag_handle
). -
Erstellen Sie ein DragSortListView-Layout, etwa so:
<com.mobeta.android.dslv.DragSortListView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:dslv="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" dslv:drag_handle_id="@id/drag_handle" dslv:float_background_color="@android:color/background_light"/>
-
Einstellen
ArrayAdapter
Ableitung mit einergetView
Überschreibung, die Ihre Listenelementansicht rendert.final ArrayAdapter<MyItem> itemAdapter = new ArrayAdapter<MyItem>(this, R.layout.my_item, R.id.my_item_name, items) { // The third parameter works around ugly Android legacy. http://stackoverflow.com/a/18529511/145173 @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); MyItem item = getItem(position); ((TextView) view.findViewById(R.id.my_item_name)).setText(item.getName()); // ... Fill in other views ... return view; } }; dragSortListView.setAdapter(itemAdapter);
-
Legen Sie einen Drop-Listener fest, der die Elemente neu anordnet, wenn sie fallen gelassen werden.
dragSortListView.setDropListener(new DragSortListView.DropListener() { @Override public void drop(int from, int to) { MyItem movedItem = items.get(from); items.remove(from); if (from > to) --from; items.add(to, movedItem); itemAdapter.notifyDataSetChanged(); } });
- See previous answers
- Weitere Antworten anzeigen