{"id":37768,"date":"2026-01-15T01:40:43","date_gmt":"2026-01-14T22:40:43","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37768"},"modified":"2026-01-15T01:40:43","modified_gmt":"2026-01-14T22:40:43","slug":"android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/","title":{"rendered":"Android RecyclerView&#8217;da Kayd\u0131rarak Silme ve Geri Alma (Swipe To Delete And Undo) Uygulamas\u0131"},"content":{"rendered":"<p><body><\/p>\n<h2>Android RecyclerView&#8217;da Kayd\u0131rarak Silme ve Geri Alma (Swipe To Delete And Undo) Uygulamas\u0131<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Android uygulamalar\u0131nda liste tabanl\u0131 verileri verimli bir \u015fekilde g\u00f6r\u00fcnt\u00fclemek ve y\u00f6netmek i\u00e7in <code>RecyclerView<\/code> vazge\u00e7ilmez bir bile\u015fendir. Kullan\u0131c\u0131lar\u0131n b\u00fcy\u00fck veri setleri aras\u0131nda ak\u0131c\u0131 bir \u015fekilde gezinmelerini sa\u011flarken, ayn\u0131 zamanda listelenen \u00f6\u011felerle etkile\u015fime girmelerine olanak tan\u0131r. Kullan\u0131c\u0131 deneyimini (UX) zenginle\u015ftiren ve uygulaman\u0131n sezgiselli\u011fini art\u0131ran yayg\u0131n etkile\u015fimlerden biri, bir liste \u00f6\u011fesini kayd\u0131rarak (swipe) silme ve bu i\u015flemi yanl\u0131\u015fl\u0131kla yap\u0131ld\u0131\u011f\u0131nda geri alma (undo) yetene\u011fidir. Bu \u00f6zellik, Google&#8217;\u0131n Materyal Tasar\u0131m y\u00f6nergeleriyle uyumlu olup, kullan\u0131c\u0131lara modern ve etkile\u015fimli bir aray\u00fcz sunar.<\/p>\n<p>Bu makalede, Android <code>RecyclerView<\/code> i\u00e7erisinde kayd\u0131rarak silme ve geri alma i\u015flevini ad\u0131m ad\u0131m nas\u0131l uygulayaca\u011f\u0131m\u0131z\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz. <code>ItemTouchHelper<\/code> s\u0131n\u0131f\u0131n\u0131n g\u00fcc\u00fcn\u00fc kullanarak kayd\u0131rma hareketlerini nas\u0131l yakalayaca\u011f\u0131m\u0131z\u0131, silme i\u015flemini nas\u0131l ger\u00e7ekle\u015ftirece\u011fimizi ve <code>Snackbar<\/code> bile\u015fenini kullanarak kullan\u0131c\u0131lara geri alma se\u00e7ene\u011fini nas\u0131l sunaca\u011f\u0131m\u0131z\u0131 \u00f6\u011frenece\u011fiz. Ayr\u0131ca, kayd\u0131rma s\u0131ras\u0131nda \u00f6\u011fenin arkas\u0131nda \u00f6zel bir arka plan veya simge g\u00f6sterme gibi g\u00f6rsel \u00f6zelle\u015ftirmeleri de ele alaca\u011f\u0131z. Bu k\u0131lavuz, hem yeni ba\u015flayanlar hem de deneyimli Android geli\u015ftiricileri i\u00e7in kapsaml\u0131 bir kaynak olmay\u0131 hedeflemektedir.<\/p>\n<h3>\u00d6n Ko\u015fullar ve Temel Kavramlar<\/h3>\n<p>Bu makaleden en iyi \u015fekilde faydalanmak i\u00e7in temel d\u00fczeyde Android geli\u015ftirme bilgisine, Kotlin veya Java programlama diline hakimiyete ve <code>RecyclerView<\/code>&#8216;\u0131n temel \u00e7al\u0131\u015fma prensiplerine a\u015fina olman\u0131z beklenmektedir.<\/p>\n<h4>RecyclerView Nedir?<\/h4>\n<p><code>RecyclerView<\/code>, b\u00fcy\u00fck veri setlerini verimli bir \u015fekilde g\u00f6r\u00fcnt\u00fclemek i\u00e7in tasarlanm\u0131\u015f g\u00fc\u00e7l\u00fc ve esnek bir widget&#8217;t\u0131r. <code>ListView<\/code>&#8216;a g\u00f6re daha geli\u015fmi\u015f bir mimariye sahiptir ve \u00f6\u011felerin yeniden kullan\u0131m\u0131n\u0131 (view recycling) optimize ederek bellek ve performans a\u00e7\u0131s\u0131ndan \u00f6nemli avantajlar sunar. Bir <code>RecyclerView<\/code> kullanmak i\u00e7in bir <code>Adapter<\/code> (veri setini g\u00f6r\u00fcn\u00fcm \u00f6\u011felerine ba\u011flar) ve bir <code>LayoutManager<\/code> (\u00f6\u011felerin ekranda nas\u0131l d\u00fczenlenece\u011fini belirler) gereklidir.<\/p>\n<h4>ItemTouchHelper Nedir?<\/h4>\n<p><code>ItemTouchHelper<\/code>, <code>RecyclerView<\/code> \u00f6\u011felerine s\u00fcr\u00fckle-b\u0131rak (drag-and-drop) ve kayd\u0131rarak silme (swipe-to-dismiss) i\u015flevselli\u011fi eklemeyi kolayla\u015ft\u0131ran bir yard\u0131mc\u0131 s\u0131n\u0131ft\u0131r. Bu s\u0131n\u0131f, dokunma olaylar\u0131n\u0131 dinler ve bu hareketleri <code>RecyclerView<\/code>&#8216;daki belirli \u00f6\u011felerle ili\u015fkilendirerek \u00f6zel davran\u0131\u015flar tetiklememize olanak tan\u0131r. <code>ItemTouchHelper<\/code>, dokunma olaylar\u0131n\u0131 kendisi i\u015fler ve bize yaln\u0131zca hangi hareketlerin desteklenece\u011fini ve bu hareketler ger\u00e7ekle\u015fti\u011finde ne yap\u0131laca\u011f\u0131n\u0131 bildiren bir <code>Callback<\/code> aray\u00fcz\u00fc sa\u011flar.<\/p>\n<h4>ItemTouchHelper.Callback Nedir?<\/h4>\n<p><code>ItemTouchHelper.Callback<\/code>, <code>ItemTouchHelper<\/code> ile <code>RecyclerView<\/code> aras\u0131ndaki k\u00f6pr\u00fc g\u00f6revi g\u00f6ren soyut bir s\u0131n\u0131ft\u0131r. Bu s\u0131n\u0131f\u0131 geni\u015fleterek, kayd\u0131rma ve s\u00fcr\u00fckleme hareketlerinin nas\u0131l ele al\u0131naca\u011f\u0131n\u0131 tan\u0131mlar\u0131z. Ba\u015fl\u0131ca metotlar\u0131 \u015funlard\u0131r:<br \/>\n*   <code>getMovementFlags()<\/code>: Hangi hareketlerin (kayd\u0131rma y\u00f6nleri, s\u00fcr\u00fckleme y\u00f6nleri) desteklenece\u011fini tan\u0131mlar.<br \/>\n*   <code>onMove()<\/code>: Bir \u00f6\u011fe s\u00fcr\u00fcklendi\u011finde \u00e7a\u011fr\u0131l\u0131r.<br \/>\n*   <code>onSwiped()<\/code>: Bir \u00f6\u011fe tamamen kayd\u0131r\u0131ld\u0131\u011f\u0131nda \u00e7a\u011fr\u0131l\u0131r.<br \/>\n*   <code>onChildDraw()<\/code>: Kayd\u0131rma veya s\u00fcr\u00fckleme s\u0131ras\u0131nda \u00f6\u011fenin g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc \u00f6zelle\u015ftirmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h4>Snackbar Nedir ve Neden Kullan\u0131l\u0131r?<\/h4>\n<p><code>Snackbar<\/code>, ekran\u0131n alt k\u0131sm\u0131nda k\u0131sa s\u00fcreli mesajlar g\u00f6stermek i\u00e7in kullan\u0131lan hafif bir geri bildirim bile\u015fenidir. Genellikle bir eylemin sonucunu bildirmek veya kullan\u0131c\u0131lara bir eylemi geri alma (undo) se\u00e7ene\u011fi sunmak i\u00e7in kullan\u0131l\u0131r. Kayd\u0131rarak silme i\u015fleminde, \u00f6\u011fe silindikten hemen sonra bir <code>Snackbar<\/code> g\u00f6stererek &#8220;\u00d6\u011fe silindi&#8221; mesaj\u0131n\u0131 ve &#8220;Geri Al&#8221; (UNDO) d\u00fc\u011fmesini sunmak, kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan olduk\u00e7a \u00f6nemlidir. <code>Snackbar<\/code> belirli bir s\u00fcre sonra otomatik olarak kaybolur, ancak kullan\u0131c\u0131 &#8220;Geri Al&#8221; d\u00fc\u011fmesine basarsa, silme i\u015flemi iptal edilebilir.<\/p>\n<h3>Proje Yap\u0131land\u0131rmas\u0131 ve Temel Bile\u015fenler<\/h3>\n<p>\u00d6ncelikle, projemizin temel yap\u0131s\u0131n\u0131 olu\u015ftural\u0131m.<\/p>\n<h4>Ba\u011f\u0131ml\u0131l\u0131klar\u0131n Eklenmesi<\/h4>\n<p><code>build.gradle (Module: app)<\/code> dosyan\u0131za <code>RecyclerView<\/code> ve Materyal Tasar\u0131m k\u00fct\u00fcphanelerini ekleyin:<\/p>\n<pre><code class=\"language-gradle\">dependencies {\n    \/\/ ... di\u011fer ba\u011f\u0131ml\u0131l\u0131klar\n    implementation 'androidx.recyclerview:recyclerview:1.2.1' \/\/ Veya en g\u00fcncel s\u00fcr\u00fcm\n    implementation 'com.google.android.material:material:1.5.0' \/\/ Veya en g\u00fcncel s\u00fcr\u00fcm\n}<\/code><\/pre>\n<h4>Veri Modeli Olu\u015fturma<\/h4>\n<p>Listemizde g\u00f6r\u00fcnt\u00fclenecek \u00f6\u011feler i\u00e7in basit bir veri s\u0131n\u0131f\u0131 tan\u0131mlayal\u0131m.<\/p>\n<pre><code class=\"language-kotlin\">\/\/ data\/MyItem.kt\npackage com.example.swipetodeleteundo.data\n\ndata class MyItem(val id: Int, val text: String)<\/code><\/pre>\n<h4>Liste \u00d6\u011fesi D\u00fczeni (item_row.xml)<\/h4>\n<p><code>RecyclerView<\/code>&#8216;daki her bir \u00f6\u011fenin nas\u0131l g\u00f6r\u00fcnece\u011fini tan\u0131mlayan bir layout dosyas\u0131 olu\u015ftural\u0131m (<code>res\/layout\/item_row.xml<\/code>). Basit bir <code>TextView<\/code> yeterli olacakt\u0131r.<\/p>\n<pre><code class=\"language-xml\"><!-- res\/layout\/item_row.xml -->\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView\n    xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginStart=\"8dp\"\n    android:layout_marginEnd=\"8dp\"\n    android:layout_marginTop=\"4dp\"\n    android:layout_marginBottom=\"4dp\"\n    app:cardCornerRadius=\"8dp\"\n    app:cardElevation=\"4dp\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\"\n        android:padding=\"16dp\"\n        android:background=\"?attr\/selectableItemBackground\">\n\n        <TextView\n            android:id=\"@+id\/itemTextView\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:textSize=\"18sp\"\n            android:textColor=\"@android:color\/black\"\n            android:text=\"\u00d6\u011fe Metni\" \/>\n\n    <\/LinearLayout>\n\n<\/androidx.cardview.widget.CardView><\/code><\/pre>\n<h4>Ana Aktivite D\u00fczeni (activity_main.xml)<\/h4>\n<p>Ana aktivitemizin layout dosyas\u0131na bir <code>RecyclerView<\/code> ekleyelim.<\/p>\n<pre><code class=\"language-xml\"><!-- res\/layout\/activity_main.xml -->\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout\n    xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\n    android:id=\"@+id\/coordinatorLayout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id\/recyclerView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layoutManager=\"androidx.recyclerview.widget.LinearLayoutManager\"\n        tools:listitem=\"@layout\/item_row\" \/>\n\n<\/androidx.coordinatorlayout.widget.CoordinatorLayout><\/code><\/pre>\n<p><code>CoordinatorLayout<\/code> kullanmam\u0131z\u0131n nedeni, <code>Snackbar<\/code>&#8216;\u0131n do\u011fru bir \u015fekilde g\u00f6r\u00fcnmesini ve <code>RecyclerView<\/code> ile etkile\u015fimini sa\u011flamakt\u0131r.<\/p>\n<h4>RecyclerView Adapt\u00f6r\u00fc Olu\u015fturma<\/h4>\n<p>Veri setimizi <code>RecyclerView<\/code>&#8216;a ba\u011flayacak adapt\u00f6r\u00fc olu\u015ftural\u0131m. Bu adapt\u00f6r, veri \u00f6\u011felerini alacak ve bunlar\u0131 <code>item_row.xml<\/code> d\u00fczenine ba\u011flayacakt\u0131r.<\/p>\n<pre><code class=\"language-kotlin\">\/\/ adapter\/MyAdapter.kt\npackage com.example.swipetodeleteundo.adapter\n\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.recyclerview.widget.RecyclerView\nimport com.example.swipetodeleteundo.R\nimport com.example.swipetodeleteundo.data.MyItem\n\nclass MyAdapter(private val items: MutableList<MyItem>) :\n    RecyclerView.Adapter<MyAdapter.MyViewHolder>() {\n\n    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {\n        val itemTextView: TextView = itemView.findViewById(R.id.itemTextView)\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {\n        val view = LayoutInflater.from(parent.context)\n            .inflate(R.layout.item_row, parent, false)\n        return MyViewHolder(view)\n    }\n\n    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {\n        holder.itemTextView.text = items[position].text\n    }\n\n    override fun getItemCount(): Int = items.size\n\n    \/\/ Silme ve geri alma i\u015flemleri i\u00e7in yard\u0131mc\u0131 metotlar\n    fun removeItem(position: Int) {\n        items.removeAt(position)\n        notifyItemRemoved(position)\n    }\n\n    fun restoreItem(item: MyItem, position: Int) {\n        items.add(position, item)\n        notifyItemInserted(position)\n    }\n\n    fun getData(): MutableList<MyItem> = items\n}<\/code><\/pre>\n<p><code>removeItem<\/code> ve <code>restoreItem<\/code> metotlar\u0131, silme ve geri alma i\u015flemlerini adapt\u00f6r \u00fczerinden y\u00f6netmemizi sa\u011flar. <code>notifyItemRemoved<\/code> ve <code>notifyItemInserted<\/code> metotlar\u0131, <code>RecyclerView<\/code>&#8216;\u0131n yaln\u0131zca etkilenen \u00f6\u011feyi yeniden \u00e7izmesini s\u00f6yleyerek performans optimizasyonu sa\u011flar.<\/p>\n<h3>ItemTouchHelper.Callback Uygulamas\u0131<\/h3>\n<p>\u015eimdi <code>ItemTouchHelper.Callback<\/code> s\u0131n\u0131f\u0131n\u0131 geni\u015fleterek kayd\u0131rma davran\u0131\u015f\u0131n\u0131 tan\u0131mlayal\u0131m.<\/p>\n<pre><code class=\"language-kotlin\">\/\/ util\/SwipeToDeleteCallback.kt\npackage com.example.swipetodeleteundo.util\n\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.graphics.Paint\nimport android.graphics.drawable.ColorDrawable\nimport androidx.core.content.ContextCompat\nimport androidx.recyclerview.widget.ItemTouchHelper\nimport androidx.recyclerview.widget.RecyclerView\nimport com.example.swipetodeleteundo.R\nimport com.google.android.material.snackbar.Snackbar\n\nclass SwipeToDeleteCallback(private val adapter: MyAdapter, private val context: Context) :\n    ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.START or ItemTouchHelper.END) {\n\n    private val deleteIcon = ContextCompat.getDrawable(context, R.drawable.ic_delete) \/\/ ic_delete.xml dosyas\u0131n\u0131 olu\u015fturaca\u011f\u0131z\n    private val intrinsicWidth = deleteIcon?.intrinsicWidth ?: 0\n    private val intrinsicHeight = deleteIcon?.intrinsicHeight ?: 0\n    private val background = ColorDrawable()\n    private val backgroundColor = Color.parseColor(\"#f44336\") \/\/ K\u0131rm\u0131z\u0131 renk\n\n    override fun getMovementFlags(\n        recyclerView: RecyclerView,\n        viewHolder: RecyclerView.ViewHolder\n    ): Int {\n        \/\/ Sadece kayd\u0131rma hareketlerini destekle, s\u00fcr\u00fcklemeyi de\u011fil.\n        \/\/ START (sa\u011fa kayd\u0131rma) ve END (sola kayd\u0131rma) y\u00f6nlerini etkinle\u015ftir.\n        return makeMovementFlags(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT)\n    }\n\n    override fun onMove(\n        recyclerView: RecyclerView,\n        viewHolder: RecyclerView.ViewHolder,\n        target: RecyclerView.ViewHolder\n    ): Boolean {\n        \/\/ S\u00fcr\u00fckleme hareketlerini desteklemedi\u011fimiz i\u00e7in burada false d\u00f6neriz.\n        return false\n    }\n\n    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {\n        val position = viewHolder.adapterPosition\n        val deletedItem = adapter.getData()[position] \/\/ Silinecek \u00f6\u011feyi yedekle\n\n        adapter.removeItem(position) \/\/ Adapt\u00f6rden \u00f6\u011feyi kald\u0131r\n\n        \/\/ Snackbar g\u00f6stererek geri alma se\u00e7ene\u011fi sun\n        Snackbar.make(\n            viewHolder.itemView,\n            \"${deletedItem.text} silindi\",\n            Snackbar.LENGTH_LONG\n        ).apply {\n            setAction(\"GER\u0130 AL\") {\n                adapter.restoreItem(deletedItem, position) \/\/ Geri al butonuna bas\u0131l\u0131rsa \u00f6\u011feyi geri ekle\n                this.dismiss() \/\/ Snackbar'\u0131 kapat\n            }\n            setBackgroundTint(ContextCompat.getColor(context, R.color.snackbar_background)) \/\/ Renk tan\u0131mlamas\u0131 yap\u0131lacak\n            setActionTextColor(ContextCompat.getColor(context, R.color.snackbar_action_text)) \/\/ Renk tan\u0131mlamas\u0131 yap\u0131lacak\n            show()\n        }\n    }\n\n    override fun onChildDraw(\n        c: Canvas,\n        recyclerView: RecyclerView,\n        viewHolder: RecyclerView.ViewHolder,\n        dX: Float,\n        dY: Float,\n        actionState: Int,\n        isCurrentlyActive: Boolean\n    ) {\n        val itemView = viewHolder.itemView\n        val itemHeight = itemView.bottom - itemView.top\n        val isCanceled = dX == 0f && !isCurrentlyActive\n\n        if (isCanceled) {\n            clearCanvas(c, itemView.right + dX, itemView.top.toFloat(), itemView.right.toFloat(), itemView.bottom.toFloat())\n            super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)\n            return\n        }\n\n        \/\/ Arka plan\u0131 \u00e7iz\n        background.color = backgroundColor\n        if (dX > 0) { \/\/ Sa\u011fa kayd\u0131rma (\u00f6\u011fe sa\u011fa do\u011fru gidiyor, arka plan solda beliriyor)\n            background.setBounds(itemView.left, itemView.top, itemView.left + dX.toInt(), itemView.bottom)\n        } else { \/\/ Sola kayd\u0131rma (\u00f6\u011fe sola do\u011fru gidiyor, arka plan sa\u011fda beliriyor)\n            background.setBounds(itemView.right + dX.toInt(), itemView.top, itemView.right, itemView.bottom)\n        }\n        background.draw(c)\n\n        \/\/ Silme simgesini \u00e7iz\n        val deleteIconTop = itemView.top + (itemHeight - intrinsicHeight) \/ 2\n        val deleteIconBottom = deleteIconTop + intrinsicHeight\n        val deleteIconMargin = (itemHeight - intrinsicHeight) \/ 2\n\n        if (dX > 0) { \/\/ Sa\u011fa kayd\u0131rma\n            val deleteIconLeft = itemView.left + deleteIconMargin\n            val deleteIconRight = itemView.left + deleteIconMargin + intrinsicWidth\n            deleteIcon?.setBounds(deleteIconLeft, deleteIconTop, deleteIconRight, deleteIconBottom)\n        } else { \/\/ Sola kayd\u0131rma\n            val deleteIconLeft = itemView.right - deleteIconMargin - intrinsicWidth\n            val deleteIconRight = itemView.right - deleteIconMargin\n            deleteIcon?.setBounds(deleteIconLeft, deleteIconTop, deleteIconRight, deleteIconBottom)\n        }\n        deleteIcon?.draw(c)\n\n        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)\n    }\n\n    private fun clearCanvas(c: Canvas, left: Float, top: Float, right: Float, bottom: Float) {\n        c.drawRect(left, top, right, bottom, Paint().apply { color = Color.TRANSPARENT })\n    }\n}<\/code><\/pre>\n<p><strong>Renk ve \u0130kon Tan\u0131mlamalar\u0131:<\/strong><br \/>\nYukar\u0131daki kodda kullan\u0131lan <code>ic_delete<\/code> ikonunu ve <code>snackbar_background<\/code>, <code>snackbar_action_text<\/code> renklerini tan\u0131mlaman\u0131z gerekmektedir.<\/p>\n<p>1.  <strong><code>ic_delete.xml<\/code> (Vector Asset):<\/strong> <code>res\/drawable<\/code> klas\u00f6r\u00fcne sa\u011f t\u0131klay\u0131n -> New -> Vector Asset. &#8220;Delete&#8221; ikonunu aray\u0131n ve projenize ekleyin.<\/p>\n<p>2.  <strong><code>colors.xml<\/code>:<\/strong> <code>res\/values\/colors.xml<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki renkleri ekleyin:<\/p>\n<pre><code class=\"language-xml\"><?xml version=\"1.0\" encoding=\"utf-8\"?>\n    <resources>\n        <!-- ... di\u011fer renkler ... -->\n        <color name=\"snackbar_background\">#323232<\/color>\n        <color name=\"snackbar_action_text\">#FFC107<\/color> <!-- Amber rengi -->\n    <\/resources><\/code><\/pre>\n<p><strong><code>SwipeToDeleteCallback<\/code> A\u00e7\u0131klamalar\u0131:<\/strong><\/p>\n<p>*   <strong><code>getMovementFlags()<\/code><\/strong>: Bu metot, hangi hareketlerin etkinle\u015ftirilece\u011fini belirtir. <code>ItemTouchHelper.LEFT<\/code> ve <code>ItemTouchHelper.RIGHT<\/code> kullanarak hem sola hem de sa\u011fa kayd\u0131rmay\u0131 etkinle\u015ftirdik. <code>0<\/code> de\u011feri s\u00fcr\u00fckleme hareketlerini devre d\u0131\u015f\u0131 b\u0131rak\u0131r.<br \/>\n*   <strong><code>onMove()<\/code><\/strong>: S\u00fcr\u00fckleme hareketlerini desteklemedi\u011fimiz i\u00e7in bu metotta her zaman <code>false<\/code> d\u00f6nd\u00fcr\u00fcr\u00fcz.<br \/>\n*   <strong><code>onSwiped()<\/code><\/strong>: Bir \u00f6\u011fe tamamen kayd\u0131r\u0131ld\u0131\u011f\u0131nda bu metot \u00e7a\u011fr\u0131l\u0131r.<br \/>\n    *   <code>adapterPosition<\/code> ile kayd\u0131r\u0131lan \u00f6\u011fenin pozisyonunu al\u0131r\u0131z.<br \/>\n    *   <code>adapter.getData()[position]<\/code> ile silinecek \u00f6\u011feyi ge\u00e7ici olarak <code>deletedItem<\/code> de\u011fi\u015fkenine kaydederiz. Bu, geri alma i\u015flemi i\u00e7in \u00f6nemlidir.<br \/>\n    *   <code>adapter.removeItem(position)<\/code> \u00e7a\u011fr\u0131s\u0131yla adapt\u00f6rden \u00f6\u011feyi kald\u0131r\u0131r\u0131z. Adapt\u00f6r, <code>notifyItemRemoved(position)<\/code> ile <code>RecyclerView<\/code>&#8216;\u0131 g\u00fcnceller.<br \/>\n    *   <code>Snackbar.make()<\/code> ile kullan\u0131c\u0131ya geri bildirim ve &#8220;Geri Al&#8221; se\u00e7ene\u011fi sunar\u0131z. <code>setAction()<\/code> metodu ile &#8220;Geri Al&#8221; d\u00fc\u011fmesine bas\u0131ld\u0131\u011f\u0131nda \u00e7al\u0131\u015facak kodu tan\u0131mlar\u0131z. Bu kod, <code>adapter.restoreItem()<\/code> \u00e7a\u011f\u0131rarak \u00f6\u011feyi orijinal pozisyonuna geri ekler.<br \/>\n*   <strong><code>onChildDraw()<\/code><\/strong>: Bu metot, kayd\u0131rma s\u0131ras\u0131nda \u00f6\u011fenin arkas\u0131ndaki g\u00f6rseli (arka plan rengi ve silme ikonu) \u00e7izmek i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>dX<\/code> de\u011feri, \u00f6\u011fenin yatayda ne kadar kayd\u0131r\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6sterir. Pozitif de\u011fer sa\u011fa, negatif de\u011fer sola kayd\u0131rmay\u0131 ifade eder.<br \/>\n    *   Arka plan rengi (<code>backgroundColor<\/code>) ve silme ikonu (<code>deleteIcon<\/code>) <code>dX<\/code> de\u011ferine g\u00f6re \u00f6\u011fenin solunda veya sa\u011f\u0131nda konumland\u0131r\u0131larak \u00e7izilir.<br \/>\n    *   <code>super.onChildDraw()<\/code> \u00e7a\u011fr\u0131s\u0131, \u00f6\u011fenin kendisinin kayd\u0131r\u0131lma animasyonunu do\u011fru bir \u015fekilde y\u00f6netir.<br \/>\n*   <strong><code>clearCanvas()<\/code><\/strong>: \u00d6\u011fenin kayd\u0131rma animasyonu bitti\u011finde, arka plan\u0131 temizlemek i\u00e7in kullan\u0131l\u0131r. Bu, \u00f6zellikle <code>onChildDraw<\/code> i\u00e7inde \u00f6zel \u00e7izim yap\u0131ld\u0131\u011f\u0131nda \u00f6nemlidir.<\/p>\n<h3>ItemTouchHelper&#8217;\u0131 RecyclerView&#8217;a Ba\u011flama<\/h3>\n<p>Son olarak, <code>MainActivity<\/code> i\u00e7erisinde <code>RecyclerView<\/code>&#8216;\u0131, adapt\u00f6r\u00fc ve <code>ItemTouchHelper<\/code>&#8216;\u0131 bir araya getirelim.<\/p>\n<pre><code class=\"language-kotlin\">\/\/ MainActivity.kt\npackage com.example.swipetodeleteundo\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport androidx.recyclerview.widget.ItemTouchHelper\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.example.swipetodeleteundo.adapter.MyAdapter\nimport com.example.swipetodeleteundo.data.MyItem\nimport com.example.swipetodeleteundo.util.SwipeToDeleteCallback\n\nclass MainActivity : AppCompatActivity() {\n\n    private lateinit var recyclerView: RecyclerView\n    private lateinit var myAdapter: MyAdapter\n    private val itemList = mutableListOf<MyItem>()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        recyclerView = findViewById(R.id.recyclerView)\n        setupRecyclerView()\n        populateItemList()\n    }\n\n    private fun setupRecyclerView() {\n        myAdapter = MyAdapter(itemList)\n        recyclerView.apply {\n            layoutManager = LinearLayoutManager(this@MainActivity)\n            adapter = myAdapter\n        }\n\n        \/\/ SwipeToDeleteCallback'i olu\u015ftur ve ItemTouchHelper'a ba\u011fla\n        val swipeHandler = SwipeToDeleteCallback(myAdapter, this)\n        val itemTouchHelper = ItemTouchHelper(swipeHandler)\n        itemTouchHelper.attachToRecyclerView(recyclerView)\n    }\n\n    private fun populateItemList() {\n        for (i in 1..20) {\n            itemList.add(MyItem(i, \"\u00d6\u011fe $i\"))\n        }\n        myAdapter.notifyDataSetChanged()\n    }\n}<\/code><\/pre>\n<p><strong><code>MainActivity<\/code> A\u00e7\u0131klamalar\u0131:<\/strong><\/p>\n<p>*   <code>setupRecyclerView()<\/code> metodu i\u00e7erisinde <code>MyAdapter<\/code>&#8216;\u0131 olu\u015fturup <code>RecyclerView<\/code>&#8216;a atar\u0131z.<br \/>\n*   En \u00f6nemli k\u0131s\u0131m: <code>SwipeToDeleteCallback<\/code> s\u0131n\u0131f\u0131m\u0131z\u0131n bir \u00f6rne\u011fini olu\u015ftururuz. Bu \u00f6rnek, adapt\u00f6r\u00fcm\u00fcz\u00fc ve <code>Context<\/code>&#8216;i parametre olarak al\u0131r.<br \/>\n*   Ard\u0131ndan, bu <code>SwipeToDeleteCallback<\/code> \u00f6rne\u011fini kullanarak bir <code>ItemTouchHelper<\/code> nesnesi olu\u015ftururuz.<br \/>\n*   Son olarak, <code>itemTouchHelper.attachToRecyclerView(recyclerView)<\/code> \u00e7a\u011fr\u0131s\u0131 ile <code>ItemTouchHelper<\/code>&#8216;\u0131 <code>RecyclerView<\/code>&#8216;a ba\u011flar\u0131z. Bu sayede <code>ItemTouchHelper<\/code>, <code>RecyclerView<\/code> \u00fczerindeki dokunma olaylar\u0131n\u0131 dinlemeye ve <code>SwipeToDeleteCallback<\/code> i\u00e7erisindeki metotlar\u0131 tetiklemeye ba\u015flar.<br \/>\n*   <code>populateItemList()<\/code> metodu, test ama\u00e7l\u0131 olarak listeye \u00f6rnek \u00f6\u011feler ekler.<\/p>\n<p>Bu ad\u0131mlar\u0131 tamamlad\u0131\u011f\u0131n\u0131zda, uygulaman\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda <code>RecyclerView<\/code>&#8216;daki \u00f6\u011feleri sola veya sa\u011fa kayd\u0131rarak silebilir ve \u00e7\u0131kan <code>Snackbar<\/code> arac\u0131l\u0131\u011f\u0131yla bu i\u015flemi geri alabilirsiniz.<\/p>\n<h3>Geli\u015fmi\u015f Konular ve En \u0130yi Uygulamalar<\/h3>\n<h4>Kal\u0131c\u0131 Veri Y\u00f6netimi (Veritaban\u0131\/API)<\/h4>\n<p>\u015eu anki uygulamam\u0131zda silme i\u015flemi yaln\u0131zca uygulama belle\u011findeki <code>MutableList<\/code> \u00fczerinde ger\u00e7ekle\u015fmektedir. Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, silinen \u00f6\u011felerin bir veritaban\u0131ndan (Room, SQLite) veya bir uzak API&#8217;den (RESTful servisler) kal\u0131c\u0131 olarak kald\u0131r\u0131lmas\u0131 gerekir.<br \/>\n*   <strong>Silme Onay\u0131<\/strong>: Kullan\u0131c\u0131 bir \u00f6\u011feyi sildi\u011finde, <code>Snackbar<\/code> g\u00f6sterilirken arka planda bir zamanlay\u0131c\u0131 ba\u015flat\u0131labilir. <code>Snackbar<\/code> kayboldu\u011funda veya &#8220;Geri Al&#8221; butonuna bas\u0131lmad\u0131\u011f\u0131nda, zamanlay\u0131c\u0131 biter ve \u00f6\u011fe veritaban\u0131ndan\/API&#8217;den kal\u0131c\u0131 olarak silinir.<br \/>\n*   <strong>Hata Y\u00f6netimi<\/strong>: Kal\u0131c\u0131 silme i\u015flemi s\u0131ras\u0131nda bir a\u011f hatas\u0131 veya veritaban\u0131 hatas\u0131 olu\u015fursa, kullan\u0131c\u0131ya bilgi verilmeli ve gerekirse \u00f6\u011fe listeye geri eklenmelidir.<\/p>\n<h4>Performans \u0130yile\u015ftirmeleri (DiffUtil)<\/h4>\n<p>B\u00fcy\u00fck veri setleriyle \u00e7al\u0131\u015f\u0131rken, <code>notifyDataSetChanged()<\/code> yerine <code>DiffUtil<\/code> kullanmak performans a\u00e7\u0131s\u0131ndan \u00e7ok daha verimlidir. <code>DiffUtil<\/code>, iki liste aras\u0131ndaki farklar\u0131 hesaplar ve <code>RecyclerView<\/code>&#8216;a yaln\u0131zca de\u011fi\u015fen, eklenen veya silinen \u00f6\u011feleri g\u00fcncellemesini s\u00f6yler. Bu, UI g\u00fcncellemelerinin daha ak\u0131c\u0131 olmas\u0131n\u0131 sa\u011flar. <code>DiffUtil<\/code>&#8216;i kullanmak i\u00e7in <code>ListAdapter<\/code> veya <code>RecyclerView.Adapter<\/code> i\u00e7inde <code>DiffUtil.Callback<\/code>&#8216;i implement etmeniz gerekir.<\/p>\n<h4>Kullan\u0131c\u0131 Deneyimi \u0130pu\u00e7lar\u0131<\/h4>\n<p>*   <strong>G\u00f6rsel Geri Bildirim<\/strong>: Kayd\u0131rma s\u0131ras\u0131nda arka plan rengi ve silme ikonu gibi g\u00f6rsel ipu\u00e7lar\u0131, kullan\u0131c\u0131n\u0131n ne oldu\u011funu anlamas\u0131na yard\u0131mc\u0131 olur.<br \/>\n*   <strong>Haptik Geri Bildirim<\/strong>: Kayd\u0131rma i\u015flemi tamamland\u0131\u011f\u0131nda hafif bir titre\u015fim (haptic feedback) eklemek, kullan\u0131c\u0131ya fiziksel bir geri bildirim sa\u011flayarak deneyimi zenginle\u015ftirebilir.<br \/>\n*   <strong>Tutarl\u0131 Davran\u0131\u015f<\/strong>: Uygulaman\u0131zdaki t\u00fcm kayd\u0131rarak silme i\u015flemleri tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmal\u0131 ve benzer g\u00f6rsel geri bildirimler sunmal\u0131d\u0131r.<br \/>\n*   <strong>Engelleme<\/strong>: \u00d6\u011fe kayd\u0131r\u0131l\u0131rken, kullan\u0131c\u0131 ba\u015fka bir \u00f6\u011feyi kayd\u0131rmamal\u0131 veya ba\u015fka bir i\u015flem yapmamal\u0131d\u0131r. Genellikle <code>ItemTouchHelper<\/code> bunu otomatik olarak y\u00f6netir.<\/p>\n<h4>\u00c7oklu Kayd\u0131rma ve Kenar Durumlar<\/h4>\n<p>*   <strong>Ayn\u0131 Anda Birden Fazla Silme<\/strong>: <code>Snackbar<\/code> yaln\u0131zca tek bir \u00f6\u011fenin geri al\u0131nmas\u0131na izin verir. Birden fazla \u00f6\u011feyi ayn\u0131 anda kayd\u0131rarak silme senaryolar\u0131nda, her silme i\u015flemi i\u00e7in ayr\u0131 bir <code>Snackbar<\/code> g\u00f6stermek veya daha karma\u015f\u0131k bir geri alma mekanizmas\u0131 tasarlamak gerekebilir.<br \/>\n*   <strong>Bo\u015f Liste<\/strong>: Liste bo\u015fald\u0131\u011f\u0131nda kullan\u0131c\u0131ya uygun bir &#8220;bo\u015f durum&#8221; (empty state) mesaj\u0131 veya g\u00f6rseli g\u00f6sterilmelidir.<br \/>\n*   <strong>Ekran D\u00f6nd\u00fcrme<\/strong>: Uygulama ekran d\u00f6nd\u00fc\u011f\u00fcnde (configuration change), <code>deletedItem<\/code> ve <code>position<\/code> gibi ge\u00e7ici verilerin korunmas\u0131 \u00f6nemlidir. Bu, <code>ViewModel<\/code> veya <code>onSaveInstanceState()<\/code> gibi mekanizmalarla sa\u011flanabilir.<\/p>\n<h4>\u00d6zel Kayd\u0131rma E\u015fikleri ve Animasyonlar<\/h4>\n<p><code>ItemTouchHelper.Callback<\/code> s\u0131n\u0131f\u0131, kayd\u0131rma e\u015fiklerini (<code>getSwipeThreshold()<\/code>, <code>getSwipeEscapeMaxVelocity()<\/code>, <code>getSwipeVelocityThreshold()<\/code>) ve animasyon s\u00fcrelerini (<code>getAnimationDuration()<\/code>) \u00f6zelle\u015ftirmenize olanak tan\u0131r. Bu metotlar\u0131 override ederek, kayd\u0131rma hareketinin ne kadar h\u0131zl\u0131 veya ne kadar uza\u011fa gitmesi gerekti\u011fini belirleyebilir, b\u00f6ylece uygulaman\u0131z\u0131n kayd\u0131rma davran\u0131\u015f\u0131n\u0131 daha hassas bir \u015fekilde kontrol edebilirsiniz.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, Android <code>RecyclerView<\/code>&#8216;da kayd\u0131rarak silme ve geri alma i\u015flevini ad\u0131m ad\u0131m nas\u0131l uygulayaca\u011f\u0131m\u0131z\u0131 \u00f6\u011frendik. <code>ItemTouchHelper<\/code>&#8216;\u0131n g\u00fcc\u00fcn\u00fc kullanarak kayd\u0131rma hareketlerini yakalad\u0131k, <code>Snackbar<\/code> ile geri alma se\u00e7ene\u011fi sunduk ve <code>onChildDraw<\/code> metodu ile kayd\u0131rma s\u0131ras\u0131nda g\u00f6rsel geri bildirimi \u00f6zelle\u015ftirdik. Bu \u00f6zellik, modern Android uygulamalar\u0131nda kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131ran ve uygulaman\u0131za profesyonel bir dokunu\u015f katan g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r.<\/p>\n<p>Uygulaman\u0131z\u0131 geli\u015ftirirken, bu temel yap\u0131y\u0131 kendi \u00f6zel ihtiya\u00e7lar\u0131n\u0131za g\u00f6re uyarlayabilir, veritaban\u0131 entegrasyonu, geli\u015fmi\u015f hata y\u00f6netimi ve daha karma\u015f\u0131k kullan\u0131c\u0131 aray\u00fcz\u00fc etkile\u015fimleri gibi geli\u015fmi\u015f konular\u0131 entegre edebilirsiniz. Unutmay\u0131n ki, iyi bir kullan\u0131c\u0131 deneyimi, sadece i\u015flevselli\u011fi sa\u011flamakla kalmaz, ayn\u0131 zamanda kullan\u0131c\u0131lar\u0131n uygulaman\u0131zla sezgisel ve keyifli bir \u015fekilde etkile\u015fime girmesini de sa\u011flar. Bu k\u0131lavuz, bu t\u00fcr etkile\u015fimleri ba\u015far\u0131yla uygulaman\u0131z i\u00e7in sa\u011flam bir temel sunmaktad\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Android RecyclerView&#8217;da Kayd\u0131rarak Silme ve Geri Alma (Swipe To Delete And Undo) Uygulamas\u0131\nGiri\u015f\nAndroid uygulamalar\u0131nda liste tabanl\u0131 verileri","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-37768","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Android RecyclerView&#039;da Kayd\u0131rarak Silme ve Geri Alma (Swipe To Delete And Undo) Uygulamas\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Android RecyclerView&#039;da Kayd\u0131rarak Silme ve Geri Alma (Swipe To Delete And Undo) Uygulamas\u0131\" \/>\n<meta property=\"og:description\" content=\"Android RecyclerView&#039;da Kayd\u0131rarak Silme ve Geri Alma (Swipe To Delete And Undo) Uygulamas\u0131 Giri\u015f Android uygulamalar\u0131nda liste tabanl\u0131 verileri\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-14T22:40:43+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Android RecyclerView&#8217;da Kayd\u0131rarak Silme ve Geri Alma (Swipe To Delete And Undo) Uygulamas\u0131\",\"datePublished\":\"2026-01-14T22:40:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/\"},\"wordCount\":1926,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/\",\"name\":\"Android RecyclerView'da Kayd\u0131rarak Silme ve Geri Alma (Swipe To Delete And Undo) Uygulamas\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-14T22:40:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Android RecyclerView&#8217;da Kayd\u0131rarak Silme ve Geri Alma (Swipe To Delete And Undo) Uygulamas\u0131\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Android RecyclerView'da Kayd\u0131rarak Silme ve Geri Alma (Swipe To Delete And Undo) Uygulamas\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/","og_locale":"tr_TR","og_type":"article","og_title":"Android RecyclerView'da Kayd\u0131rarak Silme ve Geri Alma (Swipe To Delete And Undo) Uygulamas\u0131","og_description":"Android RecyclerView'da Kayd\u0131rarak Silme ve Geri Alma (Swipe To Delete And Undo) Uygulamas\u0131 Giri\u015f Android uygulamalar\u0131nda liste tabanl\u0131 verileri","og_url":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-14T22:40:43+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Android RecyclerView&#8217;da Kayd\u0131rarak Silme ve Geri Alma (Swipe To Delete And Undo) Uygulamas\u0131","datePublished":"2026-01-14T22:40:43+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/"},"wordCount":1926,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/","url":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/","name":"Android RecyclerView'da Kayd\u0131rarak Silme ve Geri Alma (Swipe To Delete And Undo) Uygulamas\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-14T22:40:43+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-kaydirarak-silme-ve-geri-alma-swipe-to-delete-and-undo-uygulamasi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Android RecyclerView&#8217;da Kayd\u0131rarak Silme ve Geri Alma (Swipe To Delete And Undo) Uygulamas\u0131"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37768","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=37768"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37768\/revisions"}],"predecessor-version":[{"id":37769,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37768\/revisions\/37769"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37768"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37768"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37768"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}