Ich verwendete SwipeToDismiss Bibliothek, aber jetzt versuche ich auf RecyclerView zu migrieren und die Dinge sind nicht so offensichtlich, kennen Sie Ersatz für diese Bibliothek? Irgendwelche Ideen, wie man es von Grund auf implementiert?Swipe zu Dismiss für RecyclerView
Antwort
Ab Version 22.2.0 hat das Android-Supportteam eine ItemTouchHelper
Klasse hinzugefügt, die Swipe-to-Dissk und Drag-and-Drop ziemlich einfach macht. Dies ist vielleicht nicht so voll ausgestattet wie einige der Bibliotheken da draußen, aber es kommt direkt vom Android-Team.
Aktualisieren Sie Ihre build.gradle v22.2 importieren. + Der RecyclerView Bibliothek
compile 'com.android.support:recyclerview-v7:22.2.+'
Instantiate ein ItemTouchHelper mit einem geeigneten SimpleCallback
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { [...] @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) { //Remove swiped item from list and notify the RecyclerView } }; ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
** Beachten Sie, dass die SimpleCallback berücksichtigt die Richtungen, in denen Sie Drag-and-Drop und die Richtungen aktivieren möchten, die Sie aktivieren möchten.
Befestigen Sie Ihre RecyclerView
itemTouchHelper.attachToRecyclerView(recyclerView);
Wie kann man den Index des überladenen Artikels erhalten? – Orochi
@Orochi Durch Aufruf von [getAdapterPosition()] (https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html#getAdapterPosition%28%29) auf den 'viewHolder'. – SqueezyMo
Hallo Leute! Und wie erreiche ich die getAdapterPosition() von der Aktivität? Der viewHolder befindet sich auf meinem Adapter und ich weiß nicht, wie ich die View-Position erreichen kann, die ich vom ItemTouchHelper gewischt habe. Muss ich das auf Adapterhalter machen? Wie? PS: Fühlen Sie sich frei zu fragen, dies als eine neue Frage zu bewegen. –
vielleicht könnten Sie diese Bibliothek versuchen:
https://github.com/daimajia/AndroidSwipeLayout
Update: Ich habe gerade eine andere gute Bibliothek gefunden, die Sie mit RecyclerView verwenden können:
Ich habe meine eigene Implementierung ähnlich wie https://github.com/krossovochkin/Android gemacht -SwipeToDismiss-RecyclerView. Die einzige Voraussetzung war, Toast mit der Schaltfläche "Rückgängig" anzuzeigen, die in Ihrer Bibliothek nicht enthalten ist. –
Die Bibliothek von Daimajia unterstützt die Swipe-to-Kid-Funktion nicht. – akohout
@raveN Ich habe gerade meine Antwort aktualisiert. –
This library sein kann hilfreich. Sie können undo
in OnDissmiss
verwenden supertoast
Hey, ich werde es versuchen! Basiert es auf der Antwort von Pierpaolo? – Boy
Es ist nur ein 'OnTouchListener', der von [this] inspiriert wird (https://github.com/romannurik/Android-SwipeToDismiss) – codefalling
I SwipeToDeleteRV Bibliothek geschrieben, die auf Recycler Ansichten Swipe-to-delete-Undo-Funktion unterstützt. Es basiert auf ItemTouchHelper und ist sehr einfach zu benutzen.
Ich hoffe, es kann hilfreich sein für jemanden mit den gleichen Problemen konfrontiert.
Als Beispiel können Sie Ihre Recycler Ansicht in einem XML-Layout als normal, sowie einige optionale Attribute definieren:
...
xmlns:stdrv="http://schemas.android.com/apk/res-auto"
...
<io.huannguyen.swipetodeleterv.STDRecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
stdrv:border_color="@android:color/darker_gray" // specify things like border color, border width, etc.
stdrv:delete_view_background="#cccccc"
stdrv:delete_icon="@drawable/ic_archive"
stdrv:delete_icon_height="24dp"
stdrv:delete_icon_width="24dp"
stdrv:left_delete_icon_margin="32dp"
stdrv:delete_message="@string/delete_message"
stdrv:right_delete_icon_margin="32dp"
stdrv:delete_icon_color="#000000"
stdrv:has_border="true"/>
Alle stdrv Attribute sind optional. Wenn Sie sie nicht angeben, werden die Standardwerte verwendet.
Dann erstellen Sie einen Adapter, der STDAdapter Subklassen, stellen Sie sicher, dass Sie den Super-Klasse-Konstruktor aufrufen. Etwas wie folgt aus:
public class SampleAdapter extends STDAdapter<String> {
public SampleAdapter(List<String> versionList) {
super(versionList);
}
}
Als nächstes stellen Sie sicher, ein Aufruf an die setupSwipeToDelete
Methode machen die Swipe-to-Löschfunktion einzurichten.
mRecyclerView.setupSwipeToDelete(your_adapter_instance, swipe_directions);
swipe_directions
ist die Richtung, die Sie Elemente erlauben geklaut werden.
Beispiel:
// Get your recycler view from the XML layout
mRecyclerView = (STDRecyclerView) findViewById(R.id.recycler_view);
LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
mRecyclerView.setLayoutManager(layoutManager);
mAdapter = new SampleAdapter(versions);
// allow swiping in both directions (left-to-right and right-to-left)
mRecyclerView.setupSwipeToDelete(mAdapter, ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT);
Das ist es! Für erweiterte Einstellungen (d. H. Verschiedene Löschmeldungen für verschiedene Objekte festlegen, Elemente vorübergehend und dauerhaft entfernen, ...) lesen Sie bitte die Readme-Seite des Projekts.
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
final int position = viewHolder.getAdapterPosition(); //get position which is swipe
if (direction == ItemTouchHelper.LEFT) { //if swipe left
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); //alert for confirm to delete
builder.setMessage("Are you sure to delete?"); //set message
builder.setPositiveButton("REMOVE", new DialogInterface.OnClickListener() { //when click on DELETE
@Override
public void onClick(DialogInterface dialog, int which) {
adapter.notifyItemRemoved(position); //item removed from recylcerview
sqldatabase.execSQL("delete from " + TABLE_NAME + " where _id='" + (position + 1) + "'"); //query for delete
list.remove(position); //then remove item
return;
}
}).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { //not removing items if cancel is done
@Override
public void onClick(DialogInterface dialog, int which) {
adapter.notifyItemRemoved(position + 1); //notifies the RecyclerView Adapter that data in adapter has been removed at a particular position.
adapter.notifyItemRangeChanged(position, adapter.getItemCount()); //notifies the RecyclerView Adapter that positions of element in adapter has been changed from position(removed element index to end of list), please update it.
return;
}
}).show(); //show alert dialog
}
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(recyclerView); //set swipe to recylcerview
Hier in-Code, wenn der Benutzer links Swipe dann wird angezeigt und wenn Alertdialog Benutzer wählen REMOVE dann Artikel aus der Datenbank gelöscht und recyclerview wird aktualisiert, und wenn der Benutzer dann recyclerview CANCEL wählen ist, wie es ist.
Ich habe kleine Bibliothek gemacht, die ItemTouchHelper verwenden, um Gesten erstellen für Recyclerview einfacher zu machen, können Sie es hier finden github.com/olmur/rvtools –