{"id":36034,"date":"2025-12-07T02:40:43","date_gmt":"2025-12-06T23:40:43","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36034"},"modified":"2025-12-07T02:40:43","modified_gmt":"2025-12-06T23:40:43","slug":"android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/","title":{"rendered":"Android RecyclerView&#8217;da S\u00fcr\u00fckle ve B\u0131rak (Drag and Drop) \u0130\u015flevselli\u011fi"},"content":{"rendered":"<p><body><\/p>\n<h2>Android RecyclerView&#8217;da S\u00fcr\u00fckle ve B\u0131rak (Drag and Drop) \u0130\u015flevselli\u011fi<\/h2>\n<p>Android uygulamalar\u0131nda kullan\u0131c\u0131 deneyimini zenginle\u015ftirmenin ve etkile\u015fimi art\u0131rman\u0131n yollar\u0131ndan biri, listelerdeki \u00f6\u011feleri s\u00fcr\u00fckle ve b\u0131rak (drag and drop) y\u00f6ntemiyle yeniden d\u00fczenleyebilmektir. \u00d6zellikle uzun ve dinamik listelerle \u00e7al\u0131\u015f\u0131rken, RecyclerView bu t\u00fcr etkile\u015fimler i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir temel sunar. Bu makale, Android RecyclerView&#8217;da s\u00fcr\u00fckle ve b\u0131rak i\u015flevselli\u011fini ad\u0131m ad\u0131m nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131, temel kavramlardan geli\u015fmi\u015f \u00f6zelliklere kadar ayr\u0131nt\u0131l\u0131 bir \u015fekilde ele alacakt\u0131r.<\/p>\n<h2>Giri\u015f: RecyclerView ve S\u00fcr\u00fckle ve B\u0131rak<\/h2>\n<p>RecyclerView, Android platformunda listeleri, \u0131zgaralar\u0131 ve dinamik i\u00e7erik ak\u0131\u015flar\u0131n\u0131 verimli bir \u015fekilde g\u00f6r\u00fcnt\u00fclemek i\u00e7in tasarlanm\u0131\u015f g\u00fc\u00e7l\u00fc bir widget&#8217;t\u0131r. Verimli kaynak kullan\u0131m\u0131, esnek layout y\u00f6netimi ve \u00f6zelle\u015ftirilebilir animasyon yetenekleri sayesinde, ListView&#8217;\u0131n yerini alarak modern Android geli\u015ftirmesinde standart haline gelmi\u015ftir. Ancak, RecyclerView&#8217;\u0131n kendisi varsay\u0131lan olarak s\u00fcr\u00fckle ve b\u0131rak veya kayd\u0131rma (swipe) gibi etkile\u015fimleri desteklemez. Bu t\u00fcr etkile\u015fimleri sa\u011flamak i\u00e7in, Android SDK&#8217;s\u0131n\u0131n sundu\u011fu <code>ItemTouchHelper<\/code> s\u0131n\u0131f\u0131 devreye girer.<\/p>\n<p>S\u00fcr\u00fckle ve b\u0131rak i\u015flevselli\u011fi, kullan\u0131c\u0131lar\u0131n bir listedeki \u00f6\u011felerin s\u0131ras\u0131n\u0131 sezgisel bir \u015fekilde de\u011fi\u015ftirmesine, bir \u00f6\u011feyi farkl\u0131 bir konuma ta\u015f\u0131mas\u0131na veya belirli bir eylemi tetiklemesine olanak tan\u0131r. Bir e-ticaret uygulamas\u0131nda favori \u00fcr\u00fcnleri s\u0131ralamak, bir yap\u0131lacaklar listesindeki g\u00f6revlerin \u00f6nceli\u011fini de\u011fi\u015ftirmek veya bir medya galerisinde resimleri d\u00fczenlemek gibi bir\u00e7ok senaryoda bu \u00f6zellik, uygulaman\u0131n kullan\u0131labilirli\u011fini ve kullan\u0131c\u0131 memnuniyetini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Bu makale boyunca, <code>ItemTouchHelper<\/code> s\u0131n\u0131f\u0131n\u0131n nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 ve RecyclerView ile entegre edilerek s\u00fcr\u00fckle ve b\u0131rak etkile\u015fimlerinin nas\u0131l hayata ge\u00e7irilece\u011fini detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h2>Temel Bile\u015fenler ve Kavramlar<\/h2>\n<p>RecyclerView&#8217;da s\u00fcr\u00fckle ve b\u0131rak i\u015flevselli\u011fini anlamak ve uygulamak i\u00e7in baz\u0131 temel Android bile\u015fenlerini ve kavramlar\u0131n\u0131 iyi anlamak gereklidir.<\/p>\n<h3>RecyclerView, Adapter ve ViewHolder<\/h3>\n<p>*   <strong>RecyclerView:<\/strong> Veri koleksiyonlar\u0131n\u0131 esnek ve verimli bir \u015fekilde g\u00f6r\u00fcnt\u00fcleyen ana bile\u015fendir. \u00d6\u011felerin yeniden kullan\u0131m\u0131 (recycling) sayesinde performansl\u0131 \u00e7al\u0131\u015f\u0131r.<br \/>\n*   <strong>Adapter:<\/strong> Veri setini RecyclerView&#8217;da g\u00f6r\u00fcnt\u00fclenecek \u00f6\u011fe g\u00f6r\u00fcn\u00fcmlerine (item views) d\u00f6n\u00fc\u015ft\u00fcren k\u00f6pr\u00fcd\u00fcr. Veri de\u011fi\u015fikliklerini RecyclerView&#8217;a bildirerek UI&#8217;\u0131n g\u00fcncellenmesini sa\u011flar.<br \/>\n*   <strong>ViewHolder:<\/strong> Her bir liste \u00f6\u011fesinin g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc ve bu g\u00f6r\u00fcn\u00fcmdeki alt g\u00f6r\u00fcn\u00fcmleri (TextView, ImageView vb.) tutan bir kapsay\u0131c\u0131d\u0131r. Performans i\u00e7in \u00f6\u011fe g\u00f6r\u00fcn\u00fcmlerinin referanslar\u0131n\u0131 \u00f6nbelle\u011fe al\u0131r.<\/p>\n<h3>ItemTouchHelper: S\u00fcr\u00fckle ve B\u0131rak\u0131n Kalbi<\/h3>\n<p><code>ItemTouchHelper<\/code>, RecyclerView&#8217;a s\u00fcr\u00fckle ve b\u0131rak ve kayd\u0131rma (swipe-to-dismiss) i\u015flevselli\u011fini eklemek i\u00e7in tasarlanm\u0131\u015f bir yard\u0131mc\u0131 s\u0131n\u0131ft\u0131r. Bu s\u0131n\u0131f, dokunma olaylar\u0131n\u0131 dinler, hareketleri alg\u0131lar ve bu hareketlere yan\u0131t olarak RecyclerView&#8217;daki \u00f6\u011felerin konumunu veya durumunu de\u011fi\u015ftirir. <code>ItemTouchHelper<\/code>&#8216;\u0131n en \u00f6nemli \u00f6zelli\u011fi, do\u011frudan RecyclerView&#8217;a ba\u011flanabilen ve \u00f6zelle\u015ftirilebilir davran\u0131\u015flar sunan bir <code>Callback<\/code> mekanizmas\u0131d\u0131r.<\/p>\n<h3>Callback: ItemTouchHelper.Callback<\/h3>\n<p><code>ItemTouchHelper.Callback<\/code>, <code>ItemTouchHelper<\/code>&#8216;\u0131n RecyclerView \u00fczerindeki etkile\u015fimleri nas\u0131l y\u00f6netece\u011fini tan\u0131mlayan soyut bir s\u0131n\u0131ft\u0131r. Bu s\u0131n\u0131f\u0131 geni\u015fleterek veya <code>ItemTouchHelper.SimpleCallback<\/code> gibi daha basit bir uygulamas\u0131n\u0131 kullanarak, s\u00fcr\u00fckleme ve kayd\u0131rma davran\u0131\u015flar\u0131n\u0131 \u00f6zelle\u015ftirebilirsiniz. <code>Callback<\/code> s\u0131n\u0131f\u0131, a\u015fa\u011f\u0131daki temel y\u00f6ntemleri i\u00e7erir:<\/p>\n<p>*   <strong><code>getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)<\/code>:<\/strong> Bu y\u00f6ntem, belirli bir <code>ViewHolder<\/code> i\u00e7in hangi s\u00fcr\u00fckleme (drag) ve kayd\u0131rma (swipe) y\u00f6nlerinin desteklendi\u011fini belirtir. \u00d6rne\u011fin, dikey s\u00fcr\u00fcklemeyi ve sa\u011fa\/sola kayd\u0131rmay\u0131 etkinle\u015ftirebilirsiniz. D\u00f6n\u00fc\u015f de\u011feri, <code>makeMovementFlags()<\/code> metodunu kullanarak olu\u015fturulan bir bayrak (flag) kombinasyonudur.<br \/>\n*   <strong><code>onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)<\/code>:<\/strong> Bir \u00f6\u011fe s\u00fcr\u00fcklendi\u011finde ve ba\u015fka bir \u00f6\u011fenin \u00fczerine b\u0131rak\u0131ld\u0131\u011f\u0131nda \u00e7a\u011fr\u0131l\u0131r. Bu y\u00f6ntemde, veri setinizdeki \u00f6\u011felerin yerini de\u011fi\u015ftirmeniz ve <code>RecyclerView.Adapter<\/code>&#8216;a bu de\u011fi\u015fikli\u011fi <code>notifyItemMoved()<\/code> metoduyla bildirmeniz gerekir. <code>true<\/code> d\u00f6nd\u00fcrmek, \u00f6\u011fenin hareket ettirildi\u011fini ve UI&#8217;\u0131n g\u00fcncellenmesi gerekti\u011fini belirtir.<br \/>\n*   <strong><code>onSwiped(RecyclerView.ViewHolder viewHolder, int direction)<\/code>:<\/strong> Bir \u00f6\u011fe kayd\u0131r\u0131ld\u0131\u011f\u0131nda (swipe edildi\u011finde) \u00e7a\u011fr\u0131l\u0131r. Bu y\u00f6ntemde, veri setinizden \u00f6\u011feyi kald\u0131rman\u0131z ve <code>RecyclerView.Adapter<\/code>&#8216;a bu de\u011fi\u015fikli\u011fi <code>notifyItemRemoved()<\/code> metoduyla bildirmeniz gerekir.<br \/>\n*   <strong><code>onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState)<\/code>:<\/strong> Bir <code>ViewHolder<\/code>&#8216;\u0131n se\u00e7im durumu de\u011fi\u015fti\u011finde \u00e7a\u011fr\u0131l\u0131r. Bu, bir s\u00fcr\u00fckleme veya kayd\u0131rma i\u015fleminin ba\u015flad\u0131\u011f\u0131 veya bitti\u011fi anlam\u0131na gelir. Bu y\u00f6ntemi, s\u00fcr\u00fckleme s\u0131ras\u0131nda \u00f6\u011fenin g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc (\u00f6rne\u011fin, arka plan rengi, y\u00fckselme) de\u011fi\u015ftirmek i\u00e7in kullanabilirsiniz.<br \/>\n*   <strong><code>clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)<\/code>:<\/strong> S\u00fcr\u00fckleme veya kayd\u0131rma i\u015flemi tamamland\u0131\u011f\u0131nda ve <code>ViewHolder<\/code> art\u0131k se\u00e7ili olmad\u0131\u011f\u0131nda \u00e7a\u011fr\u0131l\u0131r. Bu y\u00f6ntemi, <code>onSelectedChanged()<\/code> i\u00e7inde yap\u0131lan g\u00f6rsel de\u011fi\u015fiklikleri geri almak i\u00e7in kullanabilirsiniz.<br \/>\n*   <strong><code>isLongPressDragEnabled()<\/code>:<\/strong> Varsay\u0131lan olarak <code>true<\/code> d\u00f6nd\u00fcr\u00fcr, bu da uzun bas\u0131\u015fla s\u00fcr\u00fcklemeyi etkinle\u015ftirir. E\u011fer \u00f6zel bir s\u00fcr\u00fckleme tutamac\u0131 (drag handle) kullanmak istiyorsan\u0131z bu metodu <code>false<\/code> d\u00f6nd\u00fcr\u00fcp kendi s\u00fcr\u00fckleme ba\u015flatma mant\u0131\u011f\u0131n\u0131z\u0131 uygulayabilirsiniz.<br \/>\n*   <strong><code>isItemViewSwipeEnabled()<\/code>:<\/strong> Varsay\u0131lan olarak <code>true<\/code> d\u00f6nd\u00fcr\u00fcr, bu da kayd\u0131rmay\u0131 etkinle\u015ftirir. E\u011fer sadece s\u00fcr\u00fcklemeyi desteklemek istiyorsan\u0131z bu metodu <code>false<\/code> d\u00f6nd\u00fcrebilirsiniz.<\/p>\n<p>Bu y\u00f6ntemler, s\u00fcr\u00fckle ve b\u0131rak ile kayd\u0131rma etkile\u015fimlerinin temelini olu\u015fturur. \u015eimdi, bu kavramlar\u0131 kullanarak ad\u0131m ad\u0131m bir uygulama geli\u015ftirmeye ge\u00e7elim.<\/p>\n<h2>S\u00fcr\u00fckle ve B\u0131rak \u0130\u015flevselli\u011fini Ad\u0131m Ad\u0131m Uygulama<\/h2>\n<p>RecyclerView&#8217;da s\u00fcr\u00fckle ve b\u0131rak i\u015flevselli\u011fini uygulamak, genellikle a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 i\u00e7erir:<\/p>\n<h3>1. Proje Kurulumu ve Temel RecyclerView Yap\u0131s\u0131<\/h3>\n<p>\u00d6ncelikle, standart bir RecyclerView uygulamas\u0131n\u0131n temelini olu\u015fturman\u0131z gerekir.<\/p>\n<p>*   <strong>Gradle Ba\u011f\u0131ml\u0131l\u0131klar\u0131:<\/strong> <code>build.gradle<\/code> (Module: app) dosyan\u0131za <code>recyclerview<\/code> ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 ekleyin:<\/p>\n<pre><code class=\"language-gradle\">implementation 'androidx.recyclerview:recyclerview:1.3.2' \/\/ Veya en son s\u00fcr\u00fcm<\/code><\/pre>\n<p>*   <strong>XML Layout:<\/strong> <code>activity_main.xml<\/code> veya ilgili layout dosyan\u0131za bir <code>RecyclerView<\/code> ekleyin:<\/p>\n<pre><code class=\"language-xml\"><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\" \/><\/code><\/pre>\n<p>*   <strong>Veri Modeli:<\/strong> Listede g\u00f6r\u00fcnt\u00fclenecek \u00f6\u011feleri temsil eden bir veri s\u0131n\u0131f\u0131 olu\u015fturun. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-java\">public class MyItem {\n        private String text;\n        \/\/ Constructor, getters, setters\n    }<\/code><\/pre>\n<p>*   <strong>Adapter ve ViewHolder:<\/strong> <code>RecyclerView.Adapter<\/code> ve <code>RecyclerView.ViewHolder<\/code> s\u0131n\u0131flar\u0131n\u0131z\u0131 olu\u015fturun. Adapter&#8217;\u0131n\u0131z, veri listesini tutmal\u0131 ve <code>onCreateViewHolder<\/code>, <code>onBindViewHolder<\/code> ve <code>getItemCount<\/code> metodlar\u0131n\u0131 implement etmelidir.<\/p>\n<pre><code class=\"language-java\">public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {\n        private List<MyItem> items;\n\n        public MyAdapter(List<MyItem> items) {\n            this.items = items;\n        }\n\n        @NonNull\n        @Override\n        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\n            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);\n            return new MyViewHolder(view);\n        }\n\n        @Override\n        public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {\n            holder.textView.setText(items.get(position).getText());\n        }\n\n        @Override\n        public int getItemCount() {\n            return items.size();\n        }\n\n        public static class MyViewHolder extends RecyclerView.ViewHolder {\n            public TextView textView;\n            public MyViewHolder(View itemView) {\n                super(itemView);\n                textView = itemView.findViewById(R.id.item_text);\n            }\n        }\n    }<\/code><\/pre>\n<p>*   <strong>RecyclerView&#8217;a Adapter&#8217;\u0131n Atanmas\u0131:<\/strong> <code>Activity<\/code> veya <code>Fragment<\/code> i\u00e7inde RecyclerView&#8217;\u0131 ba\u015flat\u0131n ve adapter&#8217;\u0131 atay\u0131n.<\/p>\n<pre><code class=\"language-java\">RecyclerView recyclerView = findViewById(R.id.recyclerView);\n    List<MyItem> data = new ArrayList<>();\n    \/\/ Verileri doldur...\n    MyAdapter adapter = new MyAdapter(data);\n    recyclerView.setAdapter(adapter);\n    recyclerView.setLayoutManager(new LinearLayoutManager(this));<\/code><\/pre>\n<h3>2. ItemTouchHelper.Callback S\u0131n\u0131f\u0131n\u0131 Olu\u015fturma<\/h3>\n<p>S\u00fcr\u00fckle ve b\u0131rak davran\u0131\u015f\u0131n\u0131 tan\u0131mlayacak \u00f6zel bir <code>ItemTouchHelper.Callback<\/code> s\u0131n\u0131f\u0131 olu\u015fturun. Genellikle <code>ItemTouchHelper.SimpleCallback<\/code> s\u0131n\u0131f\u0131ndan t\u00fcretmek daha kolayd\u0131r, \u00e7\u00fcnk\u00fc bu s\u0131n\u0131f <code>getMovementFlags<\/code>, <code>onMove<\/code> ve <code>onSwiped<\/code> gibi temel metodlar\u0131 soyut olarak i\u00e7erir ve di\u011fer metodlar i\u00e7in varsay\u0131lan bo\u015f implementasyonlar sunar.<\/p>\n<pre><code class=\"language-java\">public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {\n\n    private final ItemTouchHelperAdapter mAdapter;\n\n    public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {\n        mAdapter = adapter;\n    }\n\n    @Override\n    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {\n        \/\/ S\u00fcr\u00fckleme i\u00e7in yukar\u0131 ve a\u015fa\u011f\u0131 y\u00f6nleri etkinle\u015ftir.\n        \/\/ Kayd\u0131rma i\u00e7in herhangi bir y\u00f6n\u00fc etkinle\u015ftirmek istemiyorsak 0 veya ItemTouchHelper.START | ItemTouchHelper.END kullanabiliriz.\n        final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;\n        final int swipeFlags = 0; \/\/ Kayd\u0131rmay\u0131 devre d\u0131\u015f\u0131 b\u0131rakmak i\u00e7in\n        return makeMovementFlags(dragFlags, swipeFlags);\n    }\n\n    @Override\n    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {\n        \/\/ Adapter'a \u00f6\u011fenin yer de\u011fi\u015ftirdi\u011fini bildir.\n        mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());\n        return true; \/\/ Hareketin i\u015flendi\u011fini belirtir\n    }\n\n    @Override\n    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {\n        \/\/ Kayd\u0131rma devre d\u0131\u015f\u0131 b\u0131rak\u0131ld\u0131\u011f\u0131 i\u00e7in bu metod \u00e7a\u011fr\u0131lmaz.\n        \/\/ E\u011fer kayd\u0131rma etkin olsayd\u0131, burada mAdapter.onItemDismiss(viewHolder.getAdapterPosition()); \u00e7a\u011fr\u0131l\u0131rd\u0131.\n    }\n\n    @Override\n    public boolean isLongPressDragEnabled() {\n        \/\/ Uzun bas\u0131\u015fla s\u00fcr\u00fcklemeyi etkinle\u015ftir.\n        return true;\n    }\n\n    @Override\n    public boolean isItemViewSwipeEnabled() {\n        \/\/ Kayd\u0131rmay\u0131 devre d\u0131\u015f\u0131 b\u0131rak.\n        return false;\n    }\n\n    @Override\n    public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {\n        \/\/ S\u00fcr\u00fckleme veya kayd\u0131rma ba\u015flad\u0131\u011f\u0131nda\/bitti\u011finde \u00e7a\u011fr\u0131l\u0131r.\n        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {\n            if (viewHolder != null) {\n                \/\/ S\u00fcr\u00fcklenen \u00f6\u011feye g\u00f6rsel geri bildirim (\u00f6rne\u011fin, arka plan rengi) ekle.\n                viewHolder.itemView.setBackgroundColor(Color.LTGRAY);\n            }\n        }\n        super.onSelectedChanged(viewHolder, actionState);\n    }\n\n    @Override\n    public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {\n        super.clearView(recyclerView, viewHolder);\n        \/\/ S\u00fcr\u00fckleme bitti\u011finde g\u00f6rsel geri bildirimi kald\u0131r.\n        viewHolder.itemView.setBackgroundColor(Color.TRANSPARENT);\n    }\n}<\/code><\/pre>\n<p>Bu <code>Callback<\/code> s\u0131n\u0131f\u0131, <code>ItemTouchHelperAdapter<\/code> ad\u0131nda bir aray\u00fcz (interface) ile \u00e7al\u0131\u015f\u0131r. Bu aray\u00fcz, adapter&#8217;\u0131m\u0131z\u0131n s\u00fcr\u00fckle ve b\u0131rak olaylar\u0131n\u0131 i\u015flemesini sa\u011flar.<\/p>\n<pre><code class=\"language-java\">public interface ItemTouchHelperAdapter {\n    void onItemMove(int fromPosition, int toPosition);\n    \/\/ void onItemDismiss(int position); \/\/ Kayd\u0131rma etkinse eklenebilir\n}<\/code><\/pre>\n<h3>3. Adapter&#8217;\u0131 S\u00fcr\u00fckleme \u0130\u015flevselli\u011fi \u0130\u00e7in Haz\u0131rlama<\/h3>\n<p>Adapter&#8217;\u0131n\u0131z\u0131n <code>ItemTouchHelperAdapter<\/code> aray\u00fcz\u00fcn\u00fc implement etmesi ve <code>onItemMove<\/code> metodunu sa\u011flamas\u0131 gerekir. Bu metod, veri listesindeki \u00f6\u011felerin ger\u00e7ek konumunu g\u00fcncelleyecek ve RecyclerView&#8217;a UI&#8217;\u0131 yeniden \u00e7izmesi i\u00e7in bildirimde bulunacakt\u0131r.<\/p>\n<pre><code class=\"language-java\">public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements ItemTouchHelperAdapter {\n    private List<MyItem> items;\n    \/\/ ... (\u00f6nceki kod)\n\n    @Override\n    public void onItemMove(int fromPosition, int toPosition) {\n        \/\/ Veri setindeki \u00f6\u011felerin yerini de\u011fi\u015ftir\n        if (fromPosition < toPosition) {\n            for (int i = fromPosition; i < toPosition; i++) {\n                Collections.swap(items, i, i + 1);\n            }\n        } else {\n            for (int i = fromPosition; i > toPosition; i--) {\n                Collections.swap(items, i, i - 1);\n            }\n        }\n        \/\/ RecyclerView'a \u00f6\u011fenin hareket etti\u011fini bildir\n        notifyItemMoved(fromPosition, toPosition);\n    }\n}<\/code><\/pre>\n<p><strong>\u00d6nemli Not:<\/strong> <code>Collections.swap<\/code> metodunu kullanarak veri listesindeki \u00f6\u011felerin yerini de\u011fi\u015ftirdikten sonra, <strong>kesinlikle<\/strong> <code>notifyItemMoved(fromPosition, toPosition)<\/code> metodunu \u00e7a\u011f\u0131rmal\u0131s\u0131n\u0131z. Bu, RecyclerView&#8217;\u0131n UI&#8217;\u0131 do\u011fru bir \u015fekilde g\u00fcncellemesini ve animasyonlar\u0131 oynatmas\u0131n\u0131 sa\u011flar. <code>notifyDataSetChanged()<\/code> kullanmaktan ka\u00e7\u0131n\u0131n, \u00e7\u00fcnk\u00fc bu t\u00fcm listeyi yeniden \u00e7izer ve performans d\u00fc\u015f\u00fc\u015f\u00fcne neden olabilir, ayr\u0131ca s\u00fcr\u00fckleme animasyonlar\u0131n\u0131 bozar.<\/p>\n<h3>4. ItemTouchHelper&#8217;\u0131 RecyclerView&#8217;a Ba\u011flama<\/h3>\n<p>Son ad\u0131m, olu\u015fturdu\u011funuz <code>ItemTouchHelper.Callback<\/code> \u00f6rne\u011fini kullanarak bir <code>ItemTouchHelper<\/code> nesnesi olu\u015fturmak ve bunu RecyclerView&#8217;a ba\u011flamakt\u0131r. Bu i\u015flemi <code>Activity<\/code> veya <code>Fragment<\/code>&#8216;\u0131n\u0131zda yap\u0131n:<\/p>\n<pre><code class=\"language-java\">\/\/ MainActivity.java\n\/\/ ...\nItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(adapter);\nItemTouchHelper touchHelper = new ItemTouchHelper(callback);\ntouchHelper.attachToRecyclerView(recyclerView);\n\/\/ ...<\/code><\/pre>\n<p>Bu ad\u0131mlar\u0131 tamamlad\u0131\u011f\u0131n\u0131zda, uygulaman\u0131zdaki RecyclerView \u00f6\u011feleri uzun bas\u0131\u015fla s\u00fcr\u00fcklenebilir ve b\u0131rak\u0131labilir hale gelecektir.<\/p>\n<h2>Geli\u015fmi\u015f \u00d6zellikler ve \u0130yile\u015ftirmeler<\/h2>\n<p>Temel s\u00fcr\u00fckle ve b\u0131rak i\u015flevselli\u011fini uygulad\u0131ktan sonra, kullan\u0131c\u0131 deneyimini daha da zenginle\u015ftirmek i\u00e7in baz\u0131 geli\u015fmi\u015f \u00f6zellikleri ve iyile\u015ftirmeleri d\u00fc\u015f\u00fcnebilirsiniz.<\/p>\n<h3>1. G\u00f6rsel Geri Bildirimler (Visual Feedback)<\/h3>\n<p>Kullan\u0131c\u0131 bir \u00f6\u011feyi s\u00fcr\u00fcklerken veya kayd\u0131r\u0131rken g\u00f6rsel geri bildirim sa\u011flamak, etkile\u015fimi daha anla\u015f\u0131l\u0131r ve tatmin edici hale getirir.<\/p>\n<p>*   <strong><code>onSelectedChanged()<\/code> ve <code>clearView()<\/code>:<\/strong> Bu metodlar, s\u00fcr\u00fckleme veya kayd\u0131rma ba\u015flad\u0131\u011f\u0131nda ve bitti\u011finde \u00f6\u011fenin g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc de\u011fi\u015ftirmek i\u00e7in idealdir. \u00d6rne\u011fin, s\u00fcr\u00fcklenen \u00f6\u011fenin arka plan rengini de\u011fi\u015ftirebilir, bir g\u00f6lge ekleyebilir veya boyutunu hafif\u00e7e b\u00fcy\u00fctebilirsiniz.<\/p>\n<pre><code class=\"language-java\">@Override\n    public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {\n        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {\n            if (viewHolder instanceof ItemTouchHelperViewHolder) { \/\/ \u00d6zel aray\u00fcz\n                ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;\n                itemViewHolder.onItemSelected(); \/\/ ViewHolder'da g\u00f6rsel de\u011fi\u015fiklikleri y\u00f6net\n            }\n        }\n        super.onSelectedChanged(viewHolder, actionState);\n    }\n\n    @Override\n    public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {\n        super.clearView(recyclerView, viewHolder);\n        if (viewHolder instanceof ItemTouchHelperViewHolder) {\n            ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;\n            itemViewHolder.onItemClear(); \/\/ ViewHolder'da g\u00f6rsel de\u011fi\u015fiklikleri geri al\n        }\n    }<\/code><\/pre>\n<p>    Burada <code>ItemTouchHelperViewHolder<\/code> ad\u0131nda bir aray\u00fcz kullan\u0131lm\u0131\u015ft\u0131r. ViewHolder&#8217;\u0131n\u0131z bu aray\u00fcz\u00fc implement ederek g\u00f6rsel geri bildirim mant\u0131\u011f\u0131n\u0131 kendi i\u00e7inde y\u00f6netebilir.<\/p>\n<pre><code class=\"language-java\">public interface ItemTouchHelperViewHolder {\n        void onItemSelected();\n        void onItemClear();\n    }\n    \/\/ MyViewHolder s\u0131n\u0131f\u0131n\u0131zda implementasyon\n    public static class MyViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder {\n        \/\/ ...\n        @Override\n        public void onItemSelected() {\n            itemView.setBackgroundColor(Color.LTGRAY);\n            ViewCompat.setElevation(itemView, 12f); \/\/ Y\u00fckselme efekti\n        }\n\n        @Override\n        public void onItemClear() {\n            itemView.setBackgroundColor(Color.TRANSPARENT);\n            ViewCompat.setElevation(itemView, 0f);\n        }\n    }<\/code><\/pre>\n<p>*   <strong><code>onChildDraw()<\/code>:<\/strong> Bu metod, s\u00fcr\u00fckleme ve kayd\u0131rma s\u0131ras\u0131nda \u00f6\u011fenin nas\u0131l \u00e7izilece\u011fi \u00fczerinde daha fazla kontrol sa\u011flar. \u00d6rne\u011fin, kayd\u0131rma s\u0131ras\u0131nda \u00f6\u011fenin alt\u0131nda gizlenen bir &#8220;Sil&#8221; d\u00fc\u011fmesi gibi ek UI \u00f6\u011feleri \u00e7izebilirsiniz.<\/p>\n<h3>2. Belirli \u00d6\u011feleri S\u00fcr\u00fcklemeyi Engelleme<\/h3>\n<p>Baz\u0131 durumlarda, listedeki t\u00fcm \u00f6\u011felerin s\u00fcr\u00fcklenmesini istemeyebilirsiniz. \u00d6rne\u011fin, bir ba\u015fl\u0131k \u00f6\u011fesi veya sabit bir \u00f6\u011fe s\u00fcr\u00fcklenmemelidir. Bunu <code>getMovementFlags()<\/code> metodunda ko\u015fullu mant\u0131k kullanarak yapabilirsiniz:<\/p>\n<pre><code class=\"language-java\">@Override\npublic int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {\n    if (viewHolder.getItemViewType() == MyAdapter.HEADER_VIEW_TYPE) {\n        return makeMovementFlags(0, 0); \/\/ Bu \u00f6\u011fe i\u00e7in s\u00fcr\u00fckleme ve kayd\u0131rma yok\n    }\n    \/\/ Di\u011fer \u00f6\u011feler i\u00e7in s\u00fcr\u00fcklemeyi etkinle\u015ftir\n    final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;\n    final int swipeFlags = 0;\n    return makeMovementFlags(dragFlags, swipeFlags);\n}<\/code><\/pre>\n<h3>3. S\u00fcr\u00fckleme Tutamac\u0131n\u0131 (Drag Handle) Kullanma<\/h3>\n<p>Varsay\u0131lan olarak, <code>isLongPressDragEnabled()<\/code> <code>true<\/code> ise, kullan\u0131c\u0131n\u0131n \u00f6\u011fenin herhangi bir yerine uzun basmas\u0131yla s\u00fcr\u00fckleme ba\u015flar. Ancak, baz\u0131 uygulamalar \u00f6\u011fenin sadece belirli bir &#8220;tutamac\u0131ndan&#8221; (drag handle) s\u00fcr\u00fcklenmesini ister. Bu, \u00f6zellikle \u00f6\u011felerin i\u00e7inde etkile\u015fimli ba\u015fka \u00f6\u011feler (d\u00fc\u011fmeler, anahtarlar vb.) varsa kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p>Bunu uygulamak i\u00e7in:<br \/>\n1.  <code>isLongPressDragEnabled()<\/code> metodunu <code>false<\/code> d\u00f6nd\u00fcr\u00fcn.<br \/>\n2.  <code>ViewHolder<\/code>&#8216;\u0131n\u0131zdaki s\u00fcr\u00fckleme tutamac\u0131 olarak belirledi\u011finiz <code>View<\/code>&#8216;a bir <code>OnTouchListener<\/code> ekleyin.<br \/>\n3.  <code>OnTouchListener<\/code>&#8216;\u0131n <code>onTouch<\/code> metodunda, <code>MotionEvent.ACTION_DOWN<\/code> olay\u0131n\u0131 yakalay\u0131n ve <code>ItemTouchHelper<\/code>&#8216;\u0131n <code>startDrag(ViewHolder)<\/code> metodunu \u00e7a\u011f\u0131r\u0131n. Bu, s\u00fcr\u00fckleme i\u015flemini manuel olarak ba\u015flat\u0131r.<\/p>\n<pre><code class=\"language-java\">\/\/ MyAdapter.java i\u00e7inde\npublic static class MyViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder {\n    public TextView textView;\n    public ImageView dragHandle; \/\/ S\u00fcr\u00fckleme tutamac\u0131\n\n    public MyViewHolder(View itemView) {\n        super(itemView);\n        textView = itemView.findViewById(R.id.item_text);\n        dragHandle = itemView.findViewById(R.id.drag_handle);\n    }\n    \/\/ ...\n}\n\n\/\/ Activity\/Fragment i\u00e7inde\n\/\/ ...\nfinal ItemTouchHelper touchHelper = new ItemTouchHelper(callback);\ntouchHelper.attachToRecyclerView(recyclerView);\n\nadapter.setOnStartDragListener(new OnStartDragListener() {\n    @Override\n    public void onStartDrag(RecyclerView.ViewHolder viewHolder) {\n        touchHelper.startDrag(viewHolder);\n    }\n});\n\/\/ Adapter'da onStartDragListener'\u0131 tutacak ve ViewHolder'a iletecek bir mekanizma olmal\u0131.\n\/\/ onBindViewHolder i\u00e7inde dragHandle.setOnTouchListener'\u0131 ayarla.<\/code><\/pre>\n<p><code>OnStartDragListener<\/code> aray\u00fcz\u00fc ve <code>MyAdapter<\/code> i\u00e7indeki implementasyonu:<\/p>\n<pre><code class=\"language-java\">public interface OnStartDragListener {\n    void onStartDrag(RecyclerView.ViewHolder viewHolder);\n}\n\npublic class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements ItemTouchHelperAdapter {\n    \/\/ ...\n    private final OnStartDragListener mDragStartListener;\n\n    public MyAdapter(List<MyItem> items, OnStartDragListener dragStartListener) {\n        this.items = items;\n        this.mDragStartListener = dragStartListener;\n    }\n\n    @Override\n    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {\n        holder.textView.setText(items.get(position).getText());\n        holder.dragHandle.setOnTouchListener((v, event) -> {\n            if (MotionEvent.ACTION_DOWN == event.getAction()) {\n                mDragStartListener.onStartDrag(holder);\n            }\n            return false;\n        });\n    }\n    \/\/ ...\n}<\/code><\/pre>\n<h3>4. Animasyonlar ve Ge\u00e7i\u015fler<\/h3>\n<p><code>ItemTouchHelper<\/code> s\u00fcr\u00fckleme ve b\u0131rakma i\u00e7in varsay\u0131lan animasyonlar\u0131 sa\u011flar. Ancak, daha karma\u015f\u0131k veya \u00f6zel animasyonlar uygulamak isterseniz, RecyclerView&#8217;\u0131n <code>ItemAnimator<\/code> s\u0131n\u0131f\u0131n\u0131 geni\u015fletebilirsiniz. <code>ItemAnimator<\/code>&#8216;\u0131 \u00f6zelle\u015ftirirken, <code>ItemTouchHelper<\/code>&#8216;\u0131n animasyonlar\u0131yla \u00e7ak\u0131\u015fmamas\u0131na dikkat etmek \u00f6nemlidir. Genellikle, <code>ItemTouchHelper<\/code>&#8216;\u0131n sundu\u011fu varsay\u0131lan animasyonlar \u00e7o\u011fu senaryo i\u00e7in yeterli ve performanst\u0131r.<\/p>\n<h3>5. Veri Kal\u0131c\u0131l\u0131\u011f\u0131 (Data Persistence)<\/h3>\n<p>S\u00fcr\u00fckle ve b\u0131rak i\u015flemiyle liste \u00f6\u011felerinin s\u0131ras\u0131 de\u011fi\u015fti\u011finde, bu de\u011fi\u015fikli\u011fi uygulaman\u0131n kapan\u0131p a\u00e7\u0131lmas\u0131 durumunda da korumak isteyebilirsiniz. Bu, veri kal\u0131c\u0131l\u0131\u011f\u0131 gerektirir.<\/p>\n<p>*   <strong>Yerel Veritaban\u0131:<\/strong> SQLite (Room Persistence Library ile), Realm veya di\u011fer yerel veritabanlar\u0131, \u00f6\u011felerin s\u0131ras\u0131n\u0131 (\u00f6rne\u011fin, bir <code>order<\/code> veya <code>position<\/code> s\u00fctunu ekleyerek) kaydetmek i\u00e7in idealdir. <code>onItemMove<\/code> metodu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, veritaban\u0131ndaki ilgili \u00f6\u011felerin s\u0131ralama indekslerini g\u00fcncelleyebilirsiniz.<br \/>\n*   <strong>SharedPreferences:<\/strong> Daha k\u00fc\u00e7\u00fck ve basit listeler i\u00e7in, \u00f6\u011fe kimliklerinin s\u0131ral\u0131 bir listesini <code>SharedPreferences<\/code>&#8216;a JSON format\u0131nda kaydedebilirsiniz.<br \/>\n*   <strong>Uzak Sunucu:<\/strong> E\u011fer liste verileri bir sunucudan geliyorsa, <code>onItemMove<\/code> i\u015fleminden sonra sunucuya bir API \u00e7a\u011fr\u0131s\u0131 yaparak yeni s\u0131ralamay\u0131 g\u00fcncellemeniz gerekir. Bu, genellikle bir a\u011f iste\u011fi gerektirdi\u011finden asenkron olarak yap\u0131lmal\u0131d\u0131r.<\/p>\n<p>Veri kal\u0131c\u0131l\u0131\u011f\u0131, uygulaman\u0131z\u0131n kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir. Kullan\u0131c\u0131lar\u0131n yapt\u0131\u011f\u0131 de\u011fi\u015fikliklerin kaybolmamas\u0131, uygulaman\u0131za olan g\u00fcveni art\u0131r\u0131r.<\/p>\n<h2>Yayg\u0131n Sorunlar ve \u00c7\u00f6z\u00fcmleri<\/h2>\n<p>S\u00fcr\u00fckle ve b\u0131rak i\u015flevselli\u011fini uygularken kar\u015f\u0131la\u015fabilece\u011finiz baz\u0131 yayg\u0131n sorunlar ve bunlar\u0131n \u00e7\u00f6z\u00fcmleri \u015funlard\u0131r:<\/p>\n<p>*   <strong>Yanl\u0131\u015f \u0130ndeksler ve <code>notifyItemMoved()<\/code>:<\/strong> <code>onMove<\/code> metodunda <code>notifyItemMoved(fromPosition, toPosition)<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131 yapmamak veya yanl\u0131\u015f indekslerle \u00e7a\u011f\u0131rmak, RecyclerView&#8217;\u0131n UI&#8217;\u0131 do\u011fru bir \u015fekilde g\u00fcncellememesine neden olabilir. Her zaman <code>fromPosition<\/code> ve <code>toPosition<\/code> parametrelerinin do\u011fru oldu\u011fundan ve <code>Collections.swap<\/code> gibi metodlarla veri listesinin de g\u00fcncellendi\u011finden emin olun.<br \/>\n*   <strong>\u0130\u00e7 \u0130\u00e7e RecyclerView&#8217;lar:<\/strong> Bir RecyclerView i\u00e7inde ba\u015fka bir RecyclerView varsa, dokunma olaylar\u0131 \u00e7ak\u0131\u015fabilir. Bu durumda, <code>ItemTouchHelper<\/code>&#8216;\u0131n dokunma olaylar\u0131n\u0131 do\u011fru bir \u015fekilde yakalamas\u0131 i\u00e7in daha karma\u015f\u0131k bir <code>OnTouchListener<\/code> veya \u00f6zel <code>GestureDetector<\/code> implementasyonu gerekebilir.<br \/>\n*   <strong>Performans Sorunlar\u0131:<\/strong> \u00d6zellikle uzun listelerde, s\u00fcr\u00fckleme s\u0131ras\u0131nda tak\u0131lmalar ya\u015fanabilir. <code>onSelectedChanged<\/code> ve <code>clearView<\/code> metodlar\u0131nda a\u011f\u0131r i\u015flemler yapmaktan ka\u00e7\u0131n\u0131n. G\u00f6rsel geri bildirimler i\u00e7in sadece View \u00f6zelliklerini (arka plan rengi, y\u00fckselme) de\u011fi\u015ftirmek genellikle yeterlidir. <code>notifyDataSetChanged()<\/code> yerine <code>notifyItemMoved()<\/code> kullanmak da performans\u0131 art\u0131r\u0131r.<br \/>\n*   <strong>G\u00f6rsel Hatalar (Flickering, Overlapping):<\/strong> Bazen s\u00fcr\u00fckleme s\u0131ras\u0131nda \u00f6\u011felerin titremesi veya \u00fcst \u00fcste binmesi gibi g\u00f6rsel hatalar olu\u015fabilir. Bu genellikle <code>onMove<\/code> veya <code>onSelectedChanged<\/code> metodlar\u0131nda yap\u0131lan yanl\u0131\u015f UI g\u00fcncellemelerinden kaynaklan\u0131r. <code>clearView<\/code> metodunda t\u00fcm g\u00f6rsel de\u011fi\u015fikliklerin s\u0131f\u0131rland\u0131\u011f\u0131ndan emin olun. Ayr\u0131ca, <code>RecyclerView.ItemAnimator<\/code>&#8216;\u0131n varsay\u0131lan animasyonlar\u0131 ile \u00f6zel \u00e7izimlerinizin \u00e7ak\u0131\u015fmad\u0131\u011f\u0131ndan emin olun.<br \/>\n*   <strong>Fragment Yeniden Olu\u015fturma:<\/strong> Fragment&#8217;lar yeniden olu\u015fturuldu\u011funda (\u00f6rne\u011fin, ekran d\u00f6nd\u00fcrme), <code>ItemTouchHelper<\/code> ve <code>Callback<\/code> nesnelerinin do\u011fru bir \u015fekilde yeniden ba\u015flat\u0131ld\u0131\u011f\u0131ndan emin olun. Genellikle bu, <code>onViewCreated<\/code> veya <code>onCreateView<\/code> metodlar\u0131nda yap\u0131l\u0131r.<\/p>\n<h2>\u00d6rnek Senaryolar<\/h2>\n<p>S\u00fcr\u00fckle ve b\u0131rak i\u015flevselli\u011fi, \u00e7e\u015fitli uygulama t\u00fcrlerinde kullan\u0131c\u0131 deneyimini zenginle\u015ftirmek i\u00e7in kullan\u0131labilir:<\/p>\n<p>*   <strong>Yap\u0131lacaklar Listesi (To-Do List) S\u0131ralamas\u0131:<\/strong> Kullan\u0131c\u0131lar\u0131n g\u00f6revlerini \u00f6ncelik s\u0131ras\u0131na g\u00f6re kolayca yeniden d\u00fczenlemesine olanak tan\u0131r.<br \/>\n*   <strong>Galeri Uygulamalar\u0131nda Foto\u011fraf S\u0131ralamas\u0131:<\/strong> Foto\u011fraflar\u0131n veya videolar\u0131n bir alb\u00fcm i\u00e7indeki s\u0131ras\u0131n\u0131 de\u011fi\u015ftirmek i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong>Ayarlar Men\u00fcs\u00fcnde \u00d6\u011fe D\u00fczenleme:<\/strong> \u00d6zelle\u015ftirilebilir bir ayarlar men\u00fcs\u00fcnde, kullan\u0131c\u0131lar\u0131n tercih ettikleri \u00f6\u011feleri yukar\u0131 veya a\u015fa\u011f\u0131 ta\u015f\u0131mas\u0131na izin verir.<br \/>\n*   <strong>Al\u0131\u015fveri\u015f Sepeti \u00d6\u011felerini Yeniden D\u00fczenleme:<\/strong> Kullan\u0131c\u0131lar\u0131n al\u0131\u015fveri\u015f sepetindeki \u00fcr\u00fcnlerin s\u0131ras\u0131n\u0131 de\u011fi\u015ftirmesi, belki de sipari\u015f verme s\u0131ras\u0131n\u0131 etkilemesi.<br \/>\n*   <strong>Oyun Envanteri Y\u00f6netimi:<\/strong> Oyunlarda envanterdeki \u00f6\u011felerin yerini de\u011fi\u015ftirmek veya s\u0131ralamak i\u00e7in kullan\u0131labilir.<\/p>\n<p>Bu senaryolar, <code>ItemTouchHelper<\/code>&#8216;\u0131n ne kadar esnek ve \u00e7ok y\u00f6nl\u00fc oldu\u011funu g\u00f6stermektedir. Do\u011fru implementasyon ile, uygulaman\u0131z\u0131n etkile\u015fim seviyesini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilirsiniz.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Android RecyclerView&#8217;da s\u00fcr\u00fckle ve b\u0131rak i\u015flevselli\u011fi, <code>ItemTouchHelper<\/code> s\u0131n\u0131f\u0131 sayesinde olduk\u00e7a g\u00fc\u00e7l\u00fc ve esnek bir \u015fekilde uygulanabilir. Bu makalede, temel RecyclerView yap\u0131s\u0131ndan ba\u015flayarak, <code>ItemTouchHelper.Callback<\/code> s\u0131n\u0131f\u0131n\u0131n inceliklerine, ad\u0131m ad\u0131m implementasyon s\u00fcrecine ve geli\u015fmi\u015f \u00f6zelliklere kadar geni\u015f bir yelpazeyi ele ald\u0131k. G\u00f6rsel geri bildirimler, s\u00fcr\u00fckleme tutama\u00e7lar\u0131 ve veri kal\u0131c\u0131l\u0131\u011f\u0131 gibi konular, uygulaman\u0131z\u0131n kullan\u0131c\u0131 deneyimini bir \u00fcst seviyeye ta\u015f\u0131man\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p><code>ItemTouchHelper<\/code>&#8216;\u0131n sundu\u011fu esneklik, geli\u015ftiricilere sadece s\u00fcr\u00fckle ve b\u0131rak de\u011fil, ayn\u0131 zamanda kayd\u0131rma (swipe-to-dismiss) gibi di\u011fer dokunma tabanl\u0131 etkile\u015fimleri de kolayca entegre etme imkan\u0131 sunar. Do\u011fru implementasyon ve dikkatli hata y\u00f6netimi ile, kullan\u0131c\u0131lar\u0131n\u0131za sezgisel ve tatmin edici bir liste etkile\u015fimi sunabilirsiniz. Unutmay\u0131n ki, iyi bir kullan\u0131c\u0131 deneyimi, uygulaman\u0131z\u0131n ba\u015far\u0131s\u0131n\u0131n anahtarlar\u0131ndan biridir ve s\u00fcr\u00fckle ve b\u0131rak gibi \u00f6zellikler bu deneyimi zenginle\u015ftirmenin etkili yollar\u0131d\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Android RecyclerView&#8217;da S\u00fcr\u00fckle ve B\u0131rak (Drag and Drop) \u0130\u015flevselli\u011fi\nAndroid uygulamalar\u0131nda kullan\u0131c\u0131 deneyimini zenginle\u015ftirmenin ve etk","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-36034","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 S\u00fcr\u00fckle ve B\u0131rak (Drag and Drop) \u0130\u015flevselli\u011fi - 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-surukle-ve-birak-drag-and-drop-islevselligi\/\" \/>\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 S\u00fcr\u00fckle ve B\u0131rak (Drag and Drop) \u0130\u015flevselli\u011fi\" \/>\n<meta property=\"og:description\" content=\"Android RecyclerView&#039;da S\u00fcr\u00fckle ve B\u0131rak (Drag and Drop) \u0130\u015flevselli\u011fi Android uygulamalar\u0131nda kullan\u0131c\u0131 deneyimini zenginle\u015ftirmenin ve etk\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-06T23: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=\"18 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-surukle-ve-birak-drag-and-drop-islevselligi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Android RecyclerView&#8217;da S\u00fcr\u00fckle ve B\u0131rak (Drag and Drop) \u0130\u015flevselli\u011fi\",\"datePublished\":\"2025-12-06T23:40:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/\"},\"wordCount\":2567,\"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-surukle-ve-birak-drag-and-drop-islevselligi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/\",\"name\":\"Android RecyclerView'da S\u00fcr\u00fckle ve B\u0131rak (Drag and Drop) \u0130\u015flevselli\u011fi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-06T23:40:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Android RecyclerView&#8217;da S\u00fcr\u00fckle ve B\u0131rak (Drag and Drop) \u0130\u015flevselli\u011fi\"}]},{\"@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 S\u00fcr\u00fckle ve B\u0131rak (Drag and Drop) \u0130\u015flevselli\u011fi - 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-surukle-ve-birak-drag-and-drop-islevselligi\/","og_locale":"tr_TR","og_type":"article","og_title":"Android RecyclerView'da S\u00fcr\u00fckle ve B\u0131rak (Drag and Drop) \u0130\u015flevselli\u011fi","og_description":"Android RecyclerView'da S\u00fcr\u00fckle ve B\u0131rak (Drag and Drop) \u0130\u015flevselli\u011fi Android uygulamalar\u0131nda kullan\u0131c\u0131 deneyimini zenginle\u015ftirmenin ve etk","og_url":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-06T23:40:43+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Android RecyclerView&#8217;da S\u00fcr\u00fckle ve B\u0131rak (Drag and Drop) \u0130\u015flevselli\u011fi","datePublished":"2025-12-06T23:40:43+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/"},"wordCount":2567,"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-surukle-ve-birak-drag-and-drop-islevselligi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/","url":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/","name":"Android RecyclerView'da S\u00fcr\u00fckle ve B\u0131rak (Drag and Drop) \u0130\u015flevselli\u011fi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-06T23:40:43+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerviewda-surukle-ve-birak-drag-and-drop-islevselligi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Android RecyclerView&#8217;da S\u00fcr\u00fckle ve B\u0131rak (Drag and Drop) \u0130\u015flevselli\u011fi"}]},{"@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\/36034","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=36034"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36034\/revisions"}],"predecessor-version":[{"id":36035,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36034\/revisions\/36035"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36034"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36034"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36034"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}