2021年8月14日 星期六

Android RecyclerView 拖曳與排序 | 固定位置與拖曳特定的 childView | Drag And Drop The Descendants Of Viewholder

最近的新任務是RecyclerView 的拖曳與排序功能,幫 viewHolder 換位置,但是有特定的位置是不能動的,且是按著 viewHolder 的 childView 才能移動,那就開始吧~


分為 3 步驟:

1. google 可上下拖曳換位置的功能
2. 改成按著 childView 才能拖曳
3. 禁止特定位置換位置的功能


1. google 可上下拖曳換位置的功能

google recyclerView 拖曳,就會看到一些整理好的中文網站,拾人牙慧,大概拼拼湊湊就寫成了一個長按 viewHolder 可以上下換位子的功能。

參考
任意移動的RecycleView -使用ItemTouchHelper 上下拖曳篇


RecyclerView 梳理:點選&長按事件、分割線、拖曳排序、滑動刪除


2. 改成按著 childView 才能拖曳

這邊找有點久,用「recyclerview drag and drop childview」去 google 找到都不太相干,英文差就是吃虧QQ,原來在官方文檔就有,真佛心~


https://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper#startdrag


Drag And Drop The Descendants Of Viewholder

先將你建立的 ItemTouchHelperCallback#isLongPressDragEnabled 返回 false,我們手動處理每個拖曳事件,在 adapter#onBindViewHolder 時去為你要作用的 childView 設置觸控監聽,這樣就完成惹。


3. 禁止特定位置換位置的功能

我們可以看看別人的例子

https://github.com/devWilly/TabLayoutEx/blob/master/app/src/main/java/com/devwilly/tutorial/tablayoutex/callback/SimpleItemTouchHelperCallback.java


這邊他要禁止 position 0 移動,於是在 #onMove 時根據位置 fromPosition 去判斷,如果是 0 就不移動,不去執行 #mItemTouchCallBack.onItemMove ,這樣就完成了禁止某些位置移動的效果。


其實我從剛開始寫扣就覺得拖曳 view 好像是極難學會的技巧,以至於最早還是用別人的 lib,那時候也沒能力去讀別人的 source code ,只是寫久了,好像漸漸揭開戰爭迷霧,真開心哪。



沒有留言:

張貼留言