日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RecyclerView拖拽排序和滑动删除实现

發布時間:2024/7/23 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RecyclerView拖拽排序和滑动删除实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

效果圖

如何實現

那么是如何實現的呢?主要就要使用到ItemTouchHelper ,ItemTouchHelper 一個幫助開發人員處理拖拽和滑動刪除的實現類,它能夠讓你非常容易實現側滑刪除、拖拽的功能。

實現的代碼非常簡單我們只需要兩步:

實例化一個ItemTouchHelper
關聯到RecyclerView

恩,就是這么簡單。

構造方法中需要一個ItemTouchHelper.Callback,ItemTouchHelper會在拖拽的時候回調Callback中相應的方法,我們只需在Callback中實現自己的邏輯就可以了。

自定義一個類繼承實現ItemTouchHelper.Callback接口,需要實現以下方法:

getMovementFlags用于設置是否處理拖拽事件和滑動事件,以及拖拽和滑動操作的方向,有以下兩種情況:

如果是列表類型的RecyclerView,拖拽只有UP、DOWN兩個方向
如果是網格類型的則有UP、DOWN、LEFT、RIGHT四個方向

該方法需要編寫的代碼如下:

dragFlags 是拖拽標志,swipeFlags是滑動標志,我們把swipeFlags 都設置為0,暫時不考慮滑動相關操作。

如果我們設置了相關的dragFlags ,那么當我們長按item的時候就會進入拖拽并在拖拽過程中不斷回調onMove()方法,我們就在這個方法里獲取當前拖拽的item和已經被拖拽到所處位置的item的ViewHolder,有了這2個ViewHolder,我們就可以交換他們的數據集并調用Adapter的notifyItemMoved方法來刷新item。

這里的mDatas其實就是Adapter對應的數據集,我們在改變Item位置的同時當然不能忘了數據集需要同步的改變。

到這里,已經可以拖拽了,基本的效果如下:

是不是很神奇,這么復雜的特效,竟然寫了幾行代碼就搞定了~

但是拖拽的時候我們拖拽的對象不能高亮顯示,這是不友好的,我們希望拖拽的Item在拖拽的過程中背景顏色加深,這樣就需要繼續重寫下面兩個方法:

我們在開始拖拽的時候給item添加一個背景色,然后在拖拽完成的時候還原:

OK,這樣就完成了Item的拖拽排序,簡單看下現在的效果:

更加復雜的需求

上面的代碼完成了基本功能,但實際的產品需要往往可能會有些不一樣,比如說,產品希望,有一些item可以拖拽,一些item無法拖拽,就如上圖的“更多”是無法拖拽的。這個咋辦呢?

其實在上面我們實現的Callback類中有一個方法我們沒有重寫:

這個方法是為了告訴ItemTouchHelper是否需要RecyclerView支持長按拖拽,默認返回是ture(即支持),理所當然我們要支持,所以我們沒有重寫,因為默認true。但是這樣做是默認全部的item都可以拖拽,怎么實現部分item拖拽呢,查閱isLongPressDragEnabled方法的源碼發現,上面的注釋上寫著:

Default value returns true but you may want to disable this if you want to start dragging on a custom view touch using {@link #startDrag(ViewHolder)}.

意思是如果你想自定義觸摸view,那么就使用startDrag(ViewHolder)方法。

原來如此,我們可以在item的長按事件中得到當前item的ViewHolder ,然后調用ItemTouchHelper.startDrag(ViewHolder vh)就可以實現拖拽了,那就這么辦:

首先我們重寫isLongPressDragEnabled返回false,我們要自己調用拖拽過程:

接著我們給RecyclerView添加item長按事件,判斷item是否是最后一個(最后一個是“更多”),不是則開始拖拽。

但是,我們都知道RecyclerView并沒有提供OnItemLongClickListener,這個問題我們已經在上一篇推送的文章中給出了解決方案,就是使用OnItemTouchListener,然后識別觸摸手勢,這里給上傳送門:RecyclerView添加ItemClickListener的方案,我就直接使用上一篇的成果,不重復講了(這里你可以使用直接的OnItemClickListener的方案):

額外的功能

保存位置

關閉頁面以后再打開,又恢復到了初始化的位置,所以就需要保存調整的位置到本地,下次初始化的時候讀取位置。

保存位置應該由開發者自己實現,因為每個人本地化數據的方式都不一樣,我這里做一個簡單的實現,使用了開源的ACache類,兩個方法,搞定:

在clearView方法(拖拽完成)中調用存儲方法,在頁面初始化數據是調用讀取方法,具體代碼文后會給出下載鏈接。

開始拖拽時震動

支付寶的拖拽網格在長按后開始拖拽時會有一次短時間的震動提示用戶開始拖拽了,很友好的交互,我們也加一個:

添加權限:

<uses-permission android:name="android.permission.VIBRATE" />

在開始拖拽時添加下面代碼:

滑動刪除

我看到接口里面還有個onSwipe方法,沒有使用,沒錯,這個可用于滑動刪除。

僅僅需要幾行代碼實現滑動刪除:

恩,就這樣就行了?

還不行,還有標志位沒設置

我們針對非表格式的布局設置了swipeFlags為STRAT和END,那么LinearLayoutManager肯定是支持的,看下效果

fragment中的onCreateView和onViewCreated的區別和聯系

onViewCreated在onCreateView執行完后立即執行。
onCreateView返回的就是fragment要顯示的view。

參考鏈接

fragment中的onCreateView和onViewCreated的區別和聯系_百度知道

源代碼

http://download.csdn.net/detail/liaoinstan/9494601

原文鏈接

使用ItemTouchHelper輕松實現RecyclerView拖拽排序和滑動刪除

總結

以上是生活随笔為你收集整理的RecyclerView拖拽排序和滑动删除实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。