2014-12-04 18 views
110

Ho usato la libreria SwipeToDismiss ma ora sto provando a migrare a RecyclerView e le cose non sono così ovvie, conosci qualche sostituzione per questa libreria? Qualche idea su come implementarlo da zero?Scorri verso Dismiss per RecyclerView

+0

Ho creato una piccola libreria che utilizza ItemTouchHelper per semplificare la creazione di gesti per recyclerview, puoi trovarlo qui github.com/olmur/rvtools –

risposta

318

A partire dalla v22.2.0, il team di supporto Android ha incluso una classe ItemTouchHelper che rende lo scorrimento a trascinamento e il trascinamento della selezione piuttosto semplice. Questo potrebbe non essere completo come alcune delle librerie là fuori, ma viene direttamente dal team di Android.

  • Aggiornare il build.gradle per importare v22.2. + Della biblioteca RecyclerView

    compile 'com.android.support:recyclerview-v7:22.2.+' 
    
  • istanziare un ItemTouchHelper con un appropriato 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); 
    

    ** Si noti che il SimpleCallback accetta le indicazioni che si desidera abilitare il trascinamento e le direzioni che si desidera abilitare il trascinamento.

  • allegare al RecyclerView

    itemTouchHelper.attachToRecyclerView(recyclerView); 
    
+6

Come si può ottenere un indice di articoli swiped? – Orochi

+36

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

+0

Ciao ragazzi! E come posso raggiungere getAdapterPosition() dall'attività? Il viewHolder è sul mio adapter e non so come ottenere la posizione View che sto girando da ItemTouchHelper. Dovevo farlo sul supporto di Adapter? Come? PS: Sentiti libero di chiedere di spostare questa come una nuova domanda. –

13

Forse si potrebbe provare questa libreria:

https://github.com/daimajia/AndroidSwipeLayout

Aggiornamento: ho appena trovato un altro buon libreria che è possibile utilizzare con RecyclerView:

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

+0

Ho realizzato la mia implementazione simile a https://github.com/krossovochkin/Android -SwipeToDismiss-RecyclerView. L'unico requisito era mostrare Toast con il pulsante "Annulla", che non è coperto nella tua lib. –

+1

La libreria da Daimajia non supporta la funzione di scorrimento verso il basso. – akohout

+0

@raveN ho appena aggiornato la mia risposta. –

2

This library possono essere utile.È possibile implementare undo in OnDissmiss utilizzare supertoast

+0

Ehi, ho intenzione di provarlo! Si basa su quello che risponde Pierpaolo? – Boy

+0

È solo un 'OnTouchListener' ispirato da [questo] (https://github.com/romannurik/Android-SwipeToDismiss) – codefalling

2

ho scritto SwipeToDeleteRV libreria che supporta colpo-to-delete-annullare funzione sulle viste riciclatore. È basato su ItemTouchHelper e molto facile da usare.

Spero che possa essere utile per qualcuno che si trova ad affrontare gli stessi problemi.

A titolo di esempio, è possibile definire la visualizzazione riciclatore in un layout XML come normale, oltre ad alcuni attributi opzionali:

... 
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"/> 

Tutti gli attributi stdrv sono opzionali. Se non li si specifica, verranno utilizzati quelli predefiniti.

Quindi creare un adattatore che sottoclassi STDAdapter, assicurarsi di chiamare il costruttore super-classe. Qualcosa di simile a questo:

public class SampleAdapter extends STDAdapter<String> { 
public SampleAdapter(List<String> versionList) { 
    super(versionList); 
} 

}

Avanti assicurarsi che si effettua una chiamata al metodo setupSwipeToDelete per impostare il colpo-to-delete funzione up.

mRecyclerView.setupSwipeToDelete(your_adapter_instance, swipe_directions); 

swipe_directions è la direzione si consente elementi da fregato.

Esempio:

// 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); 

Questo è tutto! Per le impostazioni più avanzate (ad esempio, impostare diversi messaggi di eliminazione per elementi diversi, rimuovere temporaneamente e definitivamente gli elementi, ...) fare riferimento alla pagina di lettura del progetto.

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 

Qui in codice se strisciare utente a sinistra poi AlertDialog viene visualizzato e se l'utente selezionare REMOVE quindi elemento viene eliminato dal database e recyclerview viene aggiornato e se l'utente seleziona Annulla allora recyclerview è come è.

+0

funziona bene .. bella risposta. –

+0

Fantastico! Così facile da implementare – karenms

+0

Perché stai chiamando notifyItemRemoved in onCancel? – David

Problemi correlati