134 Stimmen

Android Listenansicht Drag and Drop sortieren

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?

84voto

heycosmo Punkte 1378

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.

28voto

amukhachov Punkte 5702

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

18voto

Arun C Punkte 8957

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.

9voto

Wox Punkte 153

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

6voto

Edward Brey Punkte 37840

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:

  1. 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
  2. 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>
  3. 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 ).

  4. 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"/>
  5. Einstellen ArrayAdapter Ableitung mit einer getView Ü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);
  6. 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();
            }
        });

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X