RecyclerView के लिए खारिज करने के लिए स्वाइप करें [बंद]


116

मैं SwipeToDismiss लाइब्रेरी का उपयोग करता था, लेकिन अब मैं RecyclerView पर माइग्रेट करने की कोशिश कर रहा हूं और चीजें इतनी स्पष्ट नहीं हैं, क्या आप इस दायित्व के लिए कोई प्रतिस्थापन जानते हैं? किसी भी विचार कैसे इसे खरोंच से लागू करने के लिए?


1
मैंने छोटी लाइब्रेरी बनाई है जो पुनर्नवीनीकरण के लिए इशारों के निर्माण के लिए आइटमटच हेल्पर का उपयोग करती है, आप इसे यहां पा सकते हैं github.com/olmur/rvtools
Olexii Muraviov

जवाबों:


337

V22.2.0 के अनुसार, एंड्रॉइड सपोर्ट टीम में एक ItemTouchHelperवर्ग शामिल किया गया है जो स्वाइप-टू- ए -खारिज और ड्रैग-एंड-ड्रॉप को बहुत सरल बनाता है। यह वहाँ से बाहर के कुछ पुस्तकालयों के रूप में पूरी तरह से चित्रित नहीं हो सकता है, लेकिन यह सीधे एंड्रॉइड टीम से आता है।

  • RecyclerView लाइब्रेरी के v22.2 + आयात करने के लिए अपने build.gradle को अपडेट करें

    compile 'com.android.support:recyclerview-v7:22.2.+'
  • एक उपयुक्त SimpleCallback के साथ एक ItemTouchHelper झटपट

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

    ** ध्यान दें कि SimpleCallback उन दिशाओं में ले जाती है, जिन्हें आप ड्रैग-एंड-ड्रॉप सक्षम करना चाहते हैं और वे दिशा-निर्देश जो आप स्वाइप करना सक्षम करना चाहते हैं।

  • अपने RecyclerView से संलग्न करें

    itemTouchHelper.attachToRecyclerView(recyclerView);

7
स्वाइप किए गए आइटम का सूचकांक कैसे प्राप्त कर सकते हैं?
MaTTo

37
@Orochi पर getAdapterPosition () कॉल करके viewHolder
स्क्वीज़ीमो जूल 21'15

1
उन्होंने स्पष्ट रूप से इस घटक के डिजाइन में बहुत अधिक सोचा नहीं था। यह केवल एक RecyclerView के साथ काम करता है। स्नैकबार्स जैसी चीजों के लिए स्वाइप-टू-खारिज मौजूद है। एक अधिक सामान्य घटक जो किसी भी दृश्य के साथ उपयोग किया जा सकता है, अधिक स्वागत किया गया होगा।
AndroidDev

4
क्या होगा यदि मैं उस मामले को संभालना चाहता हूं जब उपयोगकर्ता आंशिक रूप से स्वाइप करता है लेकिन फिर दृश्य को स्थिति में वापस खींचता है? जाहिरा तौर पर यह possibile (?) EDIT नहीं है: ठीक है, यह possibile है, लेकिन रिलीज से पहले इस दृश्य को स्वाइप करने से पहले आप इसमें बहुत कम मार्जिन ले सकते हैं। कोई उपाय?
Matteo

2
@ माटेयो: आइटमटच हेल्पर लागू करें। कॉलबैक और ओवरराइड getSwipeThreshold ()
सोफी सॉफ्टवेयर एलएलसी

36
 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

यहाँ कोड में यदि उपयोगकर्ता बाईं ओर स्वाइप करता है तो AlertDialog प्रदर्शित होता है और यदि उपयोगकर्ता REMOVE का चयन करता है तो आइटम को डेटाबेस से हटा दिया जाता है और recyclerview को रीफ्रेश किया जाता है और यदि उपयोगकर्ता CANCEL का चयन करता है तो recyclerview जैसा है।


अच्छा काम कर रहे हैं .. अच्छा जवाब।
सागर चावड़ा

बहुत बढ़िया! इतना आसान लागू करने के लिए
dianakarenms

1
आपको वास्तव में दिशा की जांच की आवश्यकता नहीं है if (direction == ItemTouchHelper.LEFT) // if swipe leftक्योंकि यह ItemTouchHelper.SimpleCallbackकेवल उस स्वाइप दिशा तक सीमित है। यदि आप बाएं और दाएं स्वाइप चाहते हैं, ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT)तो आपको दिशा की जांच करने की आवश्यकता होगी।
जैको

1
मैंने पाया कि AlertDialog के बाहर क्लिक करने से संवाद रद्द हो गया, लेकिन उस आइटम को नहीं रखा जिसे मैंने वापस स्वाइप किया था। आप इसे बिल्डर पर एक OnCancelListener जोड़कर कैप्चर कर सकते हैंAlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);builder.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { // stuff to put the item back } });
जैको

1
+1 अच्छी तरह से काम करता है। मैंने पाया adapter.notifyItemChanged(position);कि स्वाइप की गई वस्तु को वापस लाया गया, बजाय इसके notifyItemRemoved- जो अधिक तार्किक है।
जीत लिया

14

शायद आप इस लाइब्रेरी को आज़मा सकते हैं:

https://github.com/daimajia/AndroidSwipeLayout

अद्यतन: मुझे अभी एक और अच्छी लाइब्रेरी मिली है जिसे आप RecyclerView के साथ उपयोग कर सकते हैं

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


मैंने अपना कार्यान्वयन github.com/krossovochkin/Android-SwipeToDismiss-RecyclerView के समान किया । एकमात्र आवश्यकता टोस्ट को "पूर्ववत करें" बटन के साथ दिखाने के लिए थी, जो आपके परिवाद में शामिल नहीं है।
विक्टर याकुनिन

1
दैमाजिया की लाइब्रेरी स्वाइप-टू-बर्खास्त करने की सुविधा का समर्थन नहीं करती है।
एकोहट

@raveN मैंने अभी-अभी अपना उत्तर अपडेट किया है।
पियरपोलो पाओलिनी

2

यह लाइब्रेरी मददगार हो सकती है। undoआप OnDissmissउपयोग में लागू कर सकते हैंsupertoast


अरे, मैं इसे एक कोशिश देने जा रहा हूँ! क्या यह पियारपोलो के उत्तर के आधार पर है?
लड़का

यह सिर्फ एक है OnTouchListener द्वारा प्रेरित करते हैं इस
xcodebuild

2

मैंने SwipeToDeleteRV लाइब्रेरी लिखी जो रिसाइकलर व्यू पर स्वाइप-टू-डिलीट-पूर्ववत सुविधा का समर्थन करती है। यह ItemTouchHelper पर आधारित है और उपयोग करने में बहुत आसान है।

आशा है कि यह समान मुद्दों का सामना करने वाले किसी व्यक्ति के लिए सहायक हो सकता है।

एक उदाहरण के रूप में, आप अपने रीसायकल व्यू को XML लेआउट में सामान्य, प्लस कुछ वैकल्पिक विशेषताओं के रूप में परिभाषित कर सकते हैं:

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

सभी stdrv विशेषताएँ वैकल्पिक हैं। यदि आप उन्हें निर्दिष्ट नहीं करते हैं, तो डिफ़ॉल्ट का उपयोग किया जाएगा।

फिर एक एडेप्टर बनाएं जो STDAdcape को उप-वर्ग करता है, सुनिश्चित करें कि आप सुपर क्लास कंस्ट्रक्टर को कॉल करते हैं। कुछ इस तरह:

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

}

अगला सुनिश्चित करें कि आप setupSwipeToDeleteस्वाइप-टू-डिलीट फीचर को सेट करने के लिए विधि पर कॉल करें ।

mRecyclerView.setupSwipeToDelete(your_adapter_instance, swipe_directions);

swipe_directions वह दिशा है जो आप आइटम को स्वाइप करने की अनुमति देते हैं।

उदाहरण:

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

बस! अधिक उन्नत सेटिंग्स के लिए (यानी, विभिन्न मदों के लिए अलग-अलग विलोपन संदेश सेट करें, अस्थायी रूप से और स्थायी रूप से आइटम हटा दें, ...) कृपया प्रोजेक्ट रीडमे पृष्ठ देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.