2015-11-29 9 views
16

मैं "संग्रह करने के लिए स्वाइप" के रूप में एक ही Gmail एप्लिकेशन हटाने के लिए स्वाइप लागू करने के लिए कोशिश कर रहा हूँ नष्ट करने के लिए:एंड्रॉयड - स्वाइप RecyclerView

gmail swipe delete gmail swipe delete

मैं कई ट्यूटोरियल की कोशिश की है लेकिन उनमें से कोई रूप में काम करता जीमेल के रूप में तेज़, मैं बाहरी पुस्तकालय पर काम नहीं करना पसंद करता हूं। मैं यह कैसे कर सकता हूं?

संपादित करें:

मेरे कोड तो far-

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

मैं कड़ी चोट इशारा सक्षम करने के लिए प्रबंधित किया है लेकिन मैं एक पृष्ठभूमि और के तहत एक छवि को जोड़ने के लिए पता नहीं कैसे व्यूहोल्डर। मैंने item_XXX.xml फ़ाइल पर एक और फ्रेमलाउट डालने का प्रयास किया लेकिन स्वाइप पर यह पूरे आइटम को पृष्ठभूमि के साथ फेंक देता है।

+1

यह मदद मिलेगी क्लिक करें: - http://stackoverflow.com/questions/27293960/swipe-to-dismiss -for-recyclerview – Wizard

+0

आपको यह बताना चाहिए कि आपने अभी तक क्या किया है और आपने किस कोड की कोशिश की है। –

+0

एक नज़र डालें http://stackoverflow.com/questions/30820806/adding-a-colored-background-with-text-icon-under-swiped-row-when-using-androids ,ChildDraw पर ओवरराइडिंग का उपयोग करके एक समाधान है। –

उत्तर

15

मुझे इसे दूसरे दिन करना था और मुझे कुछ समस्याएं थीं इसलिए मैंने ब्लॉग पोस्ट लिखने का फैसला किया। कोई तीसरी पार्टी मुक्ति आवश्यक नहीं है।

blog post git repo

मूल रूप से, आप onChildDraw के माध्यम से "पूर्ववत राज्य" आकर्षित नहीं होगा, यह ViewHolder माध्यम से किया जाना होगा। इसके अलावा आप onSwipe में पंक्ति को वास्तव में हटा नहीं पाएंगे, बस इसे "लंबित हटाएं" के रूप में चिह्नित करें और एडाप्टर को "पूर्ववत करें" में पुन: स्थापित करने के लिए सूचित करें। एक ही समय में आपके द्वारा पोस्ट की एक Runnable वास्तव में एक्स सेकंड में पंक्ति को हटाने जब तक वापस लाएं बटन दबाया जाता है ...

+0

अच्छा कार्यान्वयन भी मैं ऐसा कुछ करने की कोशिश कर रहा था दोनों दिशाओं [आंशिक स्वाइप] में स्वाइप प्राप्त करें (http://stackoverflow.com/questions/34747458/partial-and-full-swipe-for-recyclerview-using- touchhelpercallback) लेकिन क्या हम आंशिक स्वाइप प्राप्त कर सकते हैं, बस उपयोगकर्ता जानते हैं कि वे आंशिक स्वाइप के साथ एक ही ऑपरेशन कर सकते हैं? –

+0

क्या ऑनस्वाइप के बजाय यह ऑनक्लिक करना संभव है? – gdubs

+0

जीमेल सिंगल और मल्टीसेक्शन रीसाइक्लर्विव लम्बाई प्रासंगिक कार्रवाई मोड पॉपअप विज्ञापन साझा करने के लिए – Harsha

14

RecyclerView स्वाइप के लिए सरल कोड: निम्न विवरण के साथ recyclerView के लिए

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

      } 
    }; 

फिर सेट कॉलबैक :

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

यह निश्चित रूप से काम करेगा। यदि आप स्नैक बार चाहते हैं तो अपने एक्सएमएल में समन्वयक लेआउट का उपयोग करें। आप पृष्ठभूमि बस जीमेल की तरह सेट कर सकते हैं हैं.यदि आप किसी भी dought सिर्फ लिंक

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); 
संबंधित मुद्दे