2015-11-29 2 views
16

Sto cercando di implementare scorri per eliminare lo stesso di Gmail "Swipe per archiviare":Android - Swipe per eliminare RecyclerView

gmail swipe delete gmail swipe delete

ho provato molti tutorial ma nessuno di loro lavora come veloce come gmail, Preferisco non lavorare su una libreria esterna. Come posso farlo?

Edit:

mio codice in modo di vasta

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { 
       public boolean onMove(RecyclerView recyclerView, 
               RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
//     final int fromPos = viewHolder.getAdapterPosition(); 
//     final int toPos = viewHolder.getAdapterPosition(); 
//     // move item in `fromPos` to `toPos` in adapter. 
        return true;// true if moved, false otherwise 
       } 

      @Override 
      public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) { 
       //Remove swiped item from list and notify the RecyclerView 
       mAdapter.notifyItemRemoved(viewHolder.getLayoutPosition()); 
      } 
     }; 
     ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback); 
     itemTouchHelper.attachToRecyclerView(mRecyclerView); 

Sono riuscito a consentire gesto di scorrimento ma non so come aggiungere uno sfondo e l'immagine sotto the viewHolder. Ho provato a mettere un altro FrameLayout nel file item_XXX.xml ma con lo scorrimento si getta l'intero elemento con lo sfondo.

+1

Ciò contribuirà a: - http://stackoverflow.com/questions/27293960/swipe-to-dismiss -per-recyclerview – Wizard

+0

Dovresti dire cosa hai fatto finora e quale codice hai provato. –

+0

Dai un'occhiata a http://stackoverflow.com/questions/30820806/adding-a-colored-background-with-text-icon-under-swiped-row-when-using-androids, c'è una soluzione che utilizza l'override di onChildDraw. –

risposta

15

Ho dovuto farlo l'altro giorno e ho avuto alcuni problemi quindi ho deciso di scrivere un post sul blog. Non è necessaria alcuna versione di terze parti.

blog post git repo

In sostanza, non si disegnare il "stato undo" via onChildDraw, sarebbe stato fatto tramite ViewHolder. Inoltre, non si elimina effettivamente la riga in onSwipe contrassegnandola come "in attesa di eliminazione" e notificando l'adattatore per rebindarla in "Annulla stato". Allo stesso tempo, si registra un Runnable in realtà la rimozione della fila x secondi a meno che non si preme il pulsante Annulla ...

+0

Bella implementazione anche io stavo cercando qualcosa di simile a quello che ero in grado di raggiungere lo scorrimento in entrambe le direzioni [Partial Swipe] (http://stackoverflow.com/questions/34747458/partial-and-full-swipe-for-recyclerview-using-touchhelpercallback) ma possiamo ottenere uno swipe parziale, solo per consentire l'utente sa di poter fare la stessa operazione con lo scorrimento parziale? –

+0

È possibile fare questo onclick invece di onswipe? – gdubs

+0

gmail single e multiselection recyclerview popup contestuale di azione contestuale a lunga pressione per eliminare la condivisione annuncio – Harsha

14

codice semplice per RecyclerView Swipe:

 ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT | ItemTouchHelper.DOWN | ItemTouchHelper.UP) { 

      @Override 
      public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
       Toast.makeText(ListActivity.this, "on Move", Toast.LENGTH_SHORT).show(); 
       return false; 
      } 

      @Override 
      public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) { 
       Toast.makeText(ListActivity.this, "on Swiped ", Toast.LENGTH_SHORT).show(); 
       //Remove swiped item from list and notify the RecyclerView 
       int position = viewHolder.getAdapterPosition(); 
       arrayList.remove(position); 
       adapter.notifyDataSetChanged(); 

      } 
    }; 

Quindi impostare callback per recyclerView con le dichiarazioni di sotto :

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback); 
itemTouchHelper.attachToRecyclerView(rv); 
0

Questo funzionerà sicuramente. Se vuoi uno snack bar, usa coordinatorLayout nel tuo xml. È possibile impostare lo sfondo come gmail Se avete di dought basta fare clic sul link

https://drive.google.com/open?id=11ZOrjMMSjdskt8gG8RP52V5Al5yE50dD

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) 

     { 

       Drawable background; 
       Drawable xMark; 
       int xMarkMargin; 
       boolean initiated; 

       private void init() { 
        background = new ColorDrawable(Color.RED); 
        xMark = ContextCompat.getDrawable(Activity.this, R.drawable.ic_delete_svg); 
        xMark.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP); 
        initiated = true; 
       } 

       @Override 
       public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
        Toast.makeText(Activity.this, "on Move", Toast.LENGTH_SHORT).show(); 
        return false; 
       } 

       @Override 
       public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) { 
        /*Toast.makeText(mcontext, "on Swiped ", Toast.LENGTH_SHORT).show();*/ 

        Snackbar snackbar = Snackbar 
          .make(coordinatorLayout, "Deleted Successfully", Snackbar.LENGTH_LONG) 
          .setAction("UNDO", new View.OnClickListener() { 
           @Override 
           public void onClick(View view) { 
            Snackbar snackbar1 = Snackbar.make(coordinatorLayout, "Message is restored!", Snackbar.LENGTH_SHORT); 
            snackbar1.show(); 
           } 
          }); 

        snackbar.show(); 

        //Remove swiped item from list and notify the RecyclerView 
        int position = viewHolder.getAdapterPosition(); 
        arrayList.remove(position); 
        adapter.notifyDataSetChanged(); 

       } 

       @Override 
       public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { 
        View itemView = viewHolder.itemView; 

        // not sure why, but this method get's called for viewholder that are already swiped away 
        if (viewHolder.getAdapterPosition() == -1) { 
         // not interested in those 
         return; 
        } 

        if (!initiated) { 
         init(); 
        } 

        // draw red background 
        background.setBounds(itemView.getRight() + (int) dX, itemView.getTop(), itemView.getRight(), itemView.getBottom()); 
        background.draw(c); 

        int xMarkLeft = 0; 
        int xMarkRight = 0; 
        int xMarkTop = itemView.getTop() + (itemHeight - intrinsicHeight)/2; 
        int xMarkBottom = xMarkTop + intrinsicHeight; 
        if (dX < 0) { 
         xMarkLeft = itemView.getRight() - xMarkMargin - intrinsicWidth; 
         xMarkRight = itemView.getRight() - xMarkMargin; 
        } else { 
         xMarkLeft = itemView.getLeft() + xMarkMargin; 
         xMarkRight = itemView.getLeft() + xMarkMargin + intrinsicWidth; 
        } 
        xMark.setBounds(xMarkLeft, xMarkTop, xMarkRight, xMarkBottom); 
        xMark.draw(c); 

        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); 
       } 

      }; 


      ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback); 
      itemTouchHelper.attachToRecyclerView(mRecyclerView); 
Problemi correlati