RecyclerView 實現滑動刪除和拖拽功能

Code4Android發表於2017-02-28

前言

從Android 5.0開始,谷歌推出了新的控制元件RecyclerView,相對於早它之前的ListView,優點多多,功能強大,也給我們的開發著提供了極大的便利,今天自己學習一下RecyclerView輕鬆實現滑動刪除及拖拽的效果,如下圖。

RecyclerView 實現滑動刪除和拖拽功能
相信研究過RecyclerView的同學,應該很清楚該怎麼實現這樣的效果,若是用ListView,這樣的效果實現起來可能就有點麻煩,但是在強大的RecyclerView面前這樣的的效果只需很少的程式碼,因為谷歌給我們提供了強大的工具類ItemTouchHelper,它已經處理了關於RecyclerView拖動和滑動的實現,並且我們可以在其中實現我們自己的動畫,以及定製我們想要的效果。

ItemTouchHelper.Callback有幾個重要的抽象方法,我們繼承該抽象類,並重寫抽象方法。它是我們實現滑動和拖拽重要的回撥。

該方法返回一個整數,用來指定拖拽和滑動在哪個方向是被允許的。在其中使用makeMovementFlags(int dragFlags, int swipeFlags)返回,該方法第一個引數用來指定拖動,第二個引數用來指定滑動。對於方向引數有6種

onMove方法是拖拽的回撥,引數viewHolder是拖動的Item,target是拖動的目標位置的Item,該方法如果返回true表示切換了位置,反之返回false。

onSwiped方法為Item滑動回撥,viewHolder為滑動的item,direction為滑動的方向。
上面三個方法是必須重寫的方法,當然還有其它一些可供選擇的方法。

需要注意的是,如果我們想實現拖動或者滑動必須將上面是否支援拖動或者滑動的方法返回true,否則onMove或者onSwiped方法不會執行。

功能實現

對於ItemTouchHelper 構造方法接收一個ItemTouchHelper.Callback引數,而這個Callback就是我們在在上述講到的工具類,初始化ItemTouchHelper 後通過其attachToRecyclerView(@Nullable RecyclerView recyclerView)方法將我們實現的ItemTouchHelper.Callback和RecyclerView關聯,最終達到我們的效果,程式碼看起來是不是很簡單,接下來我們看下我們自定義的Callback。

在預設情況下是支援拖動和滑動的,也就是isLongPressDragEnabled()和isItemViewSwipeEnabled()是返回true的。在該類中我們建立了一個介面ItemTouchHelperCallback並建立兩個抽象方法,分別表示拖拽和滑動。在onMove方法中回撥建立我們建立的介面方法介面onMove(int fromPosition,int toPosition),並將拖拽和 Item 的posion和目標posion傳入,posion通過ViewHolder的getAdapterPosition()獲得,然後在滑動回撥方法onSwiped中回撥onItemDelete(int positon)。到這裡我們自定義的ItemTouchHelper.Callback建立完成。

上面完成後我們只需要在我們自定義的Adapter中實現RecycleItemTouchHelper.ItemTouchHelperCallback介面,然後在回撥方法中更新介面,如下Apdater中回撥方法實現。

我們在onItemDelete方法中刪除對應posion的資料,在onMove方法中通過Collections.swap方法交換對應項資料,然後分別呼叫notifyItemRemoved和notifyItemMoved通過介面卡更新UI.
好了到這裡功能已經實現了,是不是發現程式碼很少,當然囉嗦的比較多而已。

功能升級

通過上面簡單程式碼的實現,已經可以滑動刪除和拖拽了,當然不滿足的你可能發現滑動刪除的時候沒有動畫沒有背景,但是我想更改下背景並且在滑動的過程會出現一個刪除的圖示,給使用者反饋,讓其明白該操作是刪除資料的。當然你還會想再刪除的過程中增加一個動畫。其實實現這個效果也並不是很麻煩,接下來新的方法實現登場。哦,不對,前面提到過的。

該方法就是移動過程中繪製Item的回撥。我們在actionState==ItemTouchHelper.ACTION_STATE_SWIPE時,即為滑動的時候繪製背景和刪除圖片。
初始化

經過上面的處理,發現此時滑動可以看到我們定製的藍低的刪除背景了,此時可能還有疑問,這樣刪除是不是很生硬,那就再給它加一個透明度的動畫,如下。

好了,到這裡RecyclerView實現滑動刪除和拖拽功能的已經介紹完畢了。有問題歡迎留言指出,Have a wonderful day .

原始碼傳送門

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

任選一種支付方式

RecyclerView 實現滑動刪除和拖拽功能 RecyclerView 實現滑動刪除和拖拽功能

相關文章