রিসাইকেলার ভিউয়ের জন্য খারিজ করতে সোয়াইপ করুন [বন্ধ]


116

আমি সোয়াইপটোডিজিস লাইব্রেরি ব্যবহার করতাম তবে এখন আমি রিসাইক্লারভিউতে স্থানান্তরিত করার চেষ্টা করছি এবং জিনিসগুলি এতটা সুস্পষ্ট নয়, আপনি কি এই লাইবটির কোনও প্রতিস্থাপন জানেন? কোনও ধারণা কীভাবে এটি স্ক্র্যাচ থেকে বাস্তবায়ন করবেন?


1
আমি ছোট লাইব্রেরি তৈরি করেছি যা পুনর্ব্যবহারের জন্য অঙ্গভঙ্গি তৈরি সহজ করতে আইটেম টাচ হেল্পার ব্যবহার করে, আপনি এটি এখানে পাবেন github.com/olmur/rvtools
ওলেক্সি মুরভিভ

উত্তর:


337

V22.2.0 হিসাবে, অ্যান্ড্রয়েড সমর্থন দলটি এমন একটি ItemTouchHelperশ্রেণি অন্তর্ভুক্ত করেছে যা সোয়াইপ-টু-বরখাস্ত এবং ড্রাগ-এন্ড ড্রপকে বেশ সহজ করে তোলে। এটি সেখানকার কয়েকটি গ্রন্থাগারের মতো পুরো বৈশিষ্ট্যযুক্ত নাও হতে পারে, তবে এটি সরাসরি অ্যান্ড্রয়েড দল থেকে আসে।

  • রিসাইক্লারভিউ লাইব্রেরির v22.2। + আমদানি করতে আপনার বিল্ড.gradle আপডেট করুন

    compile 'com.android.support:recyclerview-v7:22.2.+'
  • একটি উপযুক্ত সিম্পলক্যালব্যাক সহ আইটেম টাচহেল্পার ইনস্ট্যান্ট করুন

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

    ** নোট করুন যে সিম্পলক্যালব্যাক আপনাকে যে দিকনির্দেশে টেনে আনতে এবং ড্রপ করতে সক্ষম করতে চায় এবং যে দিকনির্দেশ আপনি সোয়াইপিং সক্ষম করতে চান সেগুলি গ্রহণ করে।

  • আপনার পুনর্ব্যবহারযোগ্য ভিউ সংযুক্ত করুন

    itemTouchHelper.attachToRecyclerView(recyclerView);

7
কেউ কীভাবে সোয়াইপ করা আইটেমের সূচক পেতে পারে?
ম্যাটটো

37
@ ওরোচি- তে getAdapterPosition () এ কল করে viewHolder
স্কিজিমো

1
তারা পরিষ্কারভাবে এই উপাদানটির নকশায় খুব বেশি চিন্তাভাবনা রাখেনি। এটি শুধুমাত্র একটি পুনর্ব্যবহারযোগ্য ভিউয়ের সাথে কাজ করে। স্নাপবারের মতো জিনিসের জন্য সোয়াইপ-টু-বরখাস্ত বিদ্যমান। যে কোনও ভিউর সাথে ব্যবহার করা যেতে পারে এমন আরও সাধারণ উপাদানটি আরও স্বাগত জানত।
অ্যান্ড্রয়েড ডেভ

4
আমি যদি কেসটি হ্যান্ডেল করতে চাই যখন ব্যবহারকারী আংশিকভাবে সোয়াইপ করে তবে তারপরে দৃশ্যটি আবার অবস্থানের স্থানে টেনে নিয়ে যায়? স্পষ্টতই এটি সম্ভাব্য নয় (?) সম্পাদনা: ঠিক আছে, এটি সম্ভাব্য, তবে খুব সামান্য মার্জিন রয়েছে যা আপনি প্রকাশের আগে দৃশ্যটি সরিয়ে দেওয়ার আগে থাকতে পারেন। যেকোনো পরামর্শ?
ম্যাটিও

2
@ মাত্তিও: আইটেম টাচ হেল্পার প্রয়োগ করুন all কলব্যাক এবং ওভাররাইড getSwipThreshold ()
সোফি সফটওয়্যার এলএলসি

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

এখানে কোডে যদি ব্যবহারকারী সোয়াইপ করে বামদিকে থাকে তবে সতর্কতা ডায়ালগ প্রদর্শিত হয় এবং ব্যবহারকারী যদি অপসারণ নির্বাচন করেন তবে আইটেমটি ডেটাবেস থেকে মুছে ফেলা হবে এবং পুনর্ব্যবহারযোগ্যতা রিফ্রেশ করা হবে এবং ব্যবহারকারী যদি ক্যানসেল নির্বাচন করেন তবে পুনর্ব্যবহারযোগ্য যেমন রয়েছে তেমন।


ভাল কাজ করছি .. সুন্দর উত্তর।
সাগর চাওয়াদা

অসাধারণ! বাস্তবায়ন করা এত সহজ
dianakarenms

1
আপনার কেবল দিকনির্দেশ চেকের দরকার নেই if (direction == ItemTouchHelper.LEFT) // if swipe leftকারণ এটি ItemTouchHelper.SimpleCallbackকেবল সেই সোয়াইপ দিকের মধ্যে সীমাবদ্ধ। আপনি যদি তখন বাম এবং ডান সোয়াইপগুলি চান ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT)এবং তারপরে আপনার দিকটি পরীক্ষা করা দরকার।
Jacko

1
আমি দেখতে পেলাম যে সতর্কতা ডায়ালগের বাইরে ক্লিক করা ডায়ালগটি বাতিল করেছে তবে আমি যে জিনিসটি সরিয়ে দিয়েছি তা আর রাখেনি। আপনি এটি বিল্ডারে একটি অনক্যান্সেললিস্টনার যুক্ত করে ক্যাপচার করতে পারেন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

আপডেট: আমি সবেমাত্র একটি ভাল লাইব্রেরি পেয়েছি যা আপনি রিসাইক্লারভিউয়ের সাথে ব্যবহার করতে পারেন:

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


আমি আমার নিজের প্রয়োগটি github.com/krossovochkin/Android- স্যুইপটোডোডিজিস-রিসাইক্লারভিউয়ের মতো করে তৈরি করেছি । প্রয়োজন কেবলমাত্র "পূর্বাবস্থায়" বোতাম দিয়ে টোস্টটি দেখাতে হবে, যা আপনার লিবিলে আচ্ছাদিত নয়।
ভিক্টর ইয়াকুনিন

1
দাইমাজিয়ার লাইব্রেরি সোয়াইপ-টু-খারিজ বৈশিষ্ট্যটিকে সমর্থন করে না।
akohout

@ আরভেন আমি সবেমাত্র আমার উত্তর আপডেট করেছি।
পিয়ারপাওলো পাওলিনী

2

এই গ্রন্থাগারটি সহায়ক হতে পারে You undoআপনি OnDissmissব্যবহারে প্রয়োগ করতে পারেনsupertoast


আরে, আমি চেষ্টা করে যাচ্ছি! এটি কি পিয়ারপাওলোর উত্তর দেওয়া ভিত্তিতে?
ছেলে

এটি শুধু একটি ব্যাপার OnTouchListener দ্বারা অনুপ্রাণিত করা এই
xcodebuild

2

আমি সোয়াইপটোডিলিটআরভি লাইব্রেরি লিখেছি যা পুনরায় ব্যবহারকারীর দর্শনগুলিতে সোয়াইপ-টু-ডিলিট-পূর্বাবস্থা বৈশিষ্ট্যটিকে সমর্থন করে। এটি আইটেম টাচহেল্পার ভিত্তিতে এবং ব্যবহার করা খুব সহজ।

আশা করি একই সমস্যার মুখোমুখি কারও পক্ষে এটি সহায়ক হতে পারে।

উদাহরণস্বরূপ, আপনি একটি এক্সএমএল লেআউটে আপনার পুনর্ব্যবহারযোগ্য দৃশকে সাধারণ হিসাবে সংজ্ঞায়িত করতে পারেন, এবং কিছু alচ্ছিক বৈশিষ্ট্য:

...
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 বৈশিষ্ট্যগুলি alচ্ছিক। আপনি যদি এগুলি নির্দিষ্ট না করেন তবে ডিফল্টগুলি ব্যবহার করা হবে।

তারপরে এমন একটি অ্যাডাপ্টার তৈরি করুন যা এসটিডিএডাপ্টার সাবক্লাস করে, আপনি সুপার ক্লাস কনস্ট্রাক্টরকে কল করেছেন তা নিশ্চিত করুন। এটার মতো কিছু:

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

এটাই! আরও উন্নত সেটিংসের জন্য (যেমন, বিভিন্ন আইটেমের জন্য বিভিন্ন মুছে ফেলা বার্তা সেট করুন, অস্থায়ীভাবে এবং স্থায়ীভাবে আইটেমগুলি সরিয়ে ফেলুন, ...) দয়া করে প্রকল্পের রেডমি পৃষ্ঠায় দেখুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.