2015-11-29 23 views
16

Ben "arşivlemek için Swipe" Gmail uygulaması ile aynı silmek tokatlamak uygulamak çalışıyorum silmek:Android - Swipe RecyclerView

gmail swipe delete gmail swipe delete

Birçok öğreticiler denedim ama hiçbiri olarak çalışıyor gmail gibi hızlı, Harici kütüphanede çalışmamayı tercih ederim. Nasıl yapabilirim?

Düzenleme:

Kodum öylesine uzak-i bir arka plan ve bir resim altında nasıl ekleneceğini bilmiyorum

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); 
Ben hızlıca kaydırma hareketini sağlamak başardınız

ama viewHolder. Item_XXX.xml dosyasında başka bir FrameLayout koymaya çalıştım ancak tokatlamak için tüm öğeyi arka plana atar.

+1

Bu yardımcı olacaktır tıklayın sahip .Eğer sadece gmail gibi arka plan ayarlayabilirsiniz: - http://stackoverflow.com/questions/27293960/swipe-to-dismiss -for-recyclerview – Wizard

+0

Şimdiye kadar ne yaptığınızı ve hangi kodu denediğinizi söylemelisiniz. –

+0

http://stackoverflow.com/questions/30820806/adding-a-colored-background-with-text-icon-under-swiped-row-when-using-androids bir göz atın, onChildDraw overriding kullanarak bir çözüm var. –

cevap

15

Bunu diğer gün yapmak zorunda kaldım ve bazı sorunlar yaşadım, bu yüzden bir blog yazısı yazmaya karar verdim. Hiçbir üçüncü parti gerekli değildir. Temelde git repo

blog post

, sen onChildDraw yoluyla "geri al devlet" çizmek etmem, ViewHolder aracılığıyla yapılırdı. Ayrıca, onSwipe satırını gerçekten silemezsiniz, sadece "beklemede silme" olarak işaretleyin ve "geri al" durumunda yeniden adlandırmak için bağdaştırıcıyı bilgilendirin. Aynı zamanda yayınladığınız geri alma düğmesine basıldığında sürece aslında x saniye içinde satır kaldırarak bir Runnable ...

+0

Güzel bir uygulama bile ben benzer bir şey çalışıyordum başardı her iki yönde [Kısmi Kaydırma] (http://stackoverflow.com/questions/34747458/partial-and-full-swipe-for-recyclerview-using-touchhelpercallback) hızlıca kaydırabiliriz, ancak sadece izin vermek için kısmi bir kaydırma yapabiliriz Kullanıcı kısmi tokatlamakla aynı işlemi yapabileceklerini biliyor mu? –

+0

Onswipe yerine bu onclick yapmak mümkün mü? – gdubs

+0

gmail tekli ve çok satırlı geri dönüşümlü görüntüleme longpress içeriğe dayalı eylem modu açılır reklam paylaşımı silmek için açılır – Harsha

14
RecyclerView doğru kaydırma

Basit Kod: Aşağıdaki ifadelere recyclerView için

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

      } 
    }; 

Sonra set geri arama :

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

Bu kesinlikle işe yarayacaktır. Snack barı isterseniz, xml'inizde coordinatorLayout'u kullanın. Eğer herhangi bir hamura sadece linki

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