RecyclerView için Kapatmak İçin Kaydırın [kapalı]


116

Eskiden SwipeToDismiss kitaplığı kullanıyordum ama şimdi RecyclerView'a geçmeye çalışıyorum ve işler o kadar açık değil, bu kitaplığın yerini alacak herhangi bir şey biliyor musunuz? Sıfırdan nasıl uygulanacağına dair bir fikrin var mı?


1
Geri dönüşüm için hareket oluşturmayı kolaylaştırmak için ItemTouchHelper'ı kullanan küçük bir kitaplık yaptım, burada bulabilirsiniz github.com/olmur/rvtools
Olexii Muraviov

Yanıtlar:


337

V22.2.0'dan itibaren Android destek ekibi, kaydırarak kapatmayı ItemTouchHelperve sürükleyip bırakmayı oldukça basit hale getiren bir sınıf dahil etti. Bu, bazı kütüphaneler kadar tam özellikli olmayabilir, ancak doğrudan Android ekibinden geliyor.

  • Build.gradle'ınızı RecyclerView kitaplığının v22.2. + 'Sını içe aktarmak için güncelleyin

    compile 'com.android.support:recyclerview-v7:22.2.+'
  • Uygun bir SimpleCallback ile bir ItemTouchHelper örneğini oluşturun

    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'in, sürükle ve bırak özelliğini etkinleştirmek istediğiniz yönleri ve kaydırmayı etkinleştirmek istediğiniz yönleri aldığını unutmayın.

  • RecyclerView'ınıza ekleyin

    itemTouchHelper.attachToRecyclerView(recyclerView);

7
Kaydırılan öğenin indeksi nasıl elde edilebilir?
MaTTo

37
@Orochi . Üzerinde getAdapterPosition () çağırarak viewHolder.
SqueezyMo

1
Açıkça bu bileşenin tasarımına çok fazla kafa yormadılar. Yalnızca RecyclerView ile çalışır. Atıştırmalık çubukları gibi şeyler için hızlıca kapat seçeneği mevcuttur. Herhangi bir görüşle kullanılabilecek daha genel bir bileşen daha memnuniyetle karşılanırdı.
AndroidDev

4
Ya kullanıcı kısmen kaydırdığında ancak ardından görünümü tekrar konumuna sürüklediğinde durumu halletmek istersem? Görünüşe göre bu mümkün değil (?) DÜZENLEME: tamam, mümkün, ancak görünüm serbest bırakıldığında kaydırılmadan önce kalabileceğiniz çok az bir marj var. Herhangi bir öneri?
Matteo

2
@Matteo: ItemTouchHelper.Callback ve override getSwipeThreshold ()
Sofi Software LLC Uygulama

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

Burada Kod'da, kullanıcı sola kaydırırsa AlertDialog görüntülenir ve kullanıcı KALDIR'ı seçerse öğe veritabanından silinir ve geri dönüşüm görünümü yenilenir ve kullanıcı İPTAL'i seçerse geri dönüşüm görünümü olduğu gibidir.


iyi çalışıyor .. güzel cevap.
Sagar Chavada

Müthiş! Uygulaması çok kolay
dianakarenms

1
Sadece bu kaydırma yönüyle sınırlı if (direction == ItemTouchHelper.LEFT) // if swipe leftolduğu için yön kontrolüne gerçekten ihtiyacınız yok ItemTouchHelper.SimpleCallback. Sol ve sağ kaydırma yapmak ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT)istiyorsanız, o zaman yönü kontrol etmeniz gerekir.
Jacko

1
AlertDialog'un dışına tıklamanın iletişim kutusunu iptal ettiğini ancak hızlıca kaydırdığım öğeyi koymadığını fark ettim. Bunu, Oluşturucu'ya bir OnCancelListener ekleyerek yakalayabilirsinizAlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);builder.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { // stuff to put the item back } });
Jacko

1
+1 iyi çalışıyor. Ben bulundu adapter.notifyItemChanged(position);ziyade yürütmüş madde geri getirdi notifyItemRemoveddaha mantıklı imho olan -.
winwa

14

belki bu kitaplığı deneyebilirsin:

https://github.com/daimajia/AndroidSwipeLayout

Güncelleme: RecyclerView ile kullanabileceğiniz başka bir iyi kitaplık buldum:

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


Kendi uygulamamı github.com/krossovochkin/Android-SwipeToDismiss-RecyclerView'a benzer yaptım . Tek gereksinim Toast'ı kitaplığınızda yer almayan "Geri Al" düğmesi ile göstermekti.
Viktor Yakunin

1
Daimajia kütüphanesi, kapatmak için kaydır özelliğini desteklemiyor.
akohout

@raveN Cevabımı yeni güncelledim.
Pierpaolo Paolini


2

Geri dönüşümcü görünümlerinde kaydırarak sil ve geri al özelliğini destekleyen SwipeToDeleteRV kitaplığı yazdım . ItemTouchHelper tabanlıdır ve kullanımı çok kolaydır.

Umarım aynı sorunlarla karşılaşan birine yardımcı olabilir.

Örnek olarak, geri dönüşümlü görünümünüzü bir XML düzeninde normal olarak ve ayrıca bazı isteğe bağlı nitelikleri tanımlayabilirsiniz:

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

Tüm stdrv öznitelikleri isteğe bağlıdır. Bunları belirtmezseniz, varsayılan olanlar kullanılacaktır.

Ardından, STDAdapter alt sınıfları olan bir bağdaştırıcı oluşturun, süper sınıf yapıcısını çağırdığınızdan emin olun. Bunun gibi bir şey:

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

}

Ardından, setupSwipeToDeletesilmek için kaydır özelliğini ayarlamak için yönteme bir çağrı yaptığınızdan emin olun .

mRecyclerView.setupSwipeToDelete(your_adapter_instance, swipe_directions);

swipe_directions öğelerin kaydırılmasına izin verdiğiniz yön.

Misal:

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

Bu kadar! Daha gelişmiş ayarlar için (yani, farklı öğeler için farklı silme mesajları ayarlayın, öğeleri geçici ve kalıcı olarak kaldırın, ...) lütfen proje benioku sayfasına bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.