2014-12-04 5 views
110

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

+0

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 –

Antwort

318

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); 
    
+6

Wie kann man den Index des überladenen Artikels erhalten? – Orochi

+36

@Orochi Durch Aufruf von [getAdapterPosition()] (https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html#getAdapterPosition%28%29) auf den 'viewHolder'. – SqueezyMo

+0

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. –

13

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:

https://github.com/hudomju/android-swipe-to-dismiss-undo

+0

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. –

+1

Die Bibliothek von Daimajia unterstützt die Swipe-to-Kid-Funktion nicht. – akohout

+0

@raveN Ich habe gerade meine Antwort aktualisiert. –

2

This library sein kann hilfreich. Sie können undo in OnDissmiss verwenden supertoast

implementieren
+0

Hey, ich werde es versuchen! Basiert es auf der Antwort von Pierpaolo? – Boy

+0

Es ist nur ein 'OnTouchListener', der von [this] inspiriert wird (https://github.com/romannurik/Android-SwipeToDismiss) – codefalling

2

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.

23
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.

+0

funktioniert gut .. nette Antwort. –

+0

Super! So einfach zu implementieren – karenms

+0

Warum rufen Sie notifyItemRemoved in onCancel? – David