ItemTouchHelper 實現交互動畫


目錄介紹

  • 01.拖拽需要實現功能
  • 02.幾個重要的方法說明
  • 03.簡單實現思路
  • 04.拖拽效果上優化
  • 05.完整代碼展示

好消息

  • 博客筆記大匯總【16年3月到至今】,包括Java基礎及深入知識點,Android技術博客,Python學習筆記等等,還包括平時開發中遇到的bug匯總,當然也在工作之余收集了大量的面試題,長期更新維護並且修正,持續完善……開源的文件是markdown格式的!同時也開源了生活博客,從12年起,積累共計N篇[近100萬字,陸續搬到網上],轉載請注明出處,謝謝!
  • 鏈接地址:https://github.com/yangchong211/YCBlogs
  • 如果覺得好,可以star一下,謝謝!當然也歡迎提出建議,萬事起於忽微,量變引起質變!

01.拖拽需要實現功能

  • 需要實現拖拽的功能如下所示
    • 長按item后拖動,與其他item交換位置
    • 按住item右面的圖標后拖動,與其他item交換位置
    • 左滑item變透明並縮小,超出屏幕后,其他item補上
    • 右滑item變透明並縮小,超出屏幕后,其他item補上

02.幾個重要的方法說明

  • 幾個重要的方法說明
    • 需要自定義類實現ItemTouchHelper.Callback類,並重寫其中幾個方法

03.簡單實現思路

  • 幾個方法中代碼思路
    • 要想達到上面功能需求,在getMovementFlags方法中,當用戶拖拽或者滑動Item的時候需要我們告訴系統滑動或者拖拽的方向,那我們知道支持拖拽和滑動刪除的無非就是LinearLayoutManager和GridLayoutManager了,所以可以根據布局管理器的不同做了響應的區分。
    • 在onMove方法中處理拖拽的回調邏輯,那么什么時候被調用?當Item被拖拽排序移動到另一個Item的位置的時候被調用。在onSwiped方法[當Item被滑動刪除到不見]中處理被刪除后的邏輯。為了降低代碼耦合度,可以通過接口listener回調的方式交給外部處理。
  • 上下拖動時與其他item進行位置交換
    • ItemTouchHelper.Callback本身不具備將兩個item互換位置的功能,但RecyclerView可以,我們可以在item拖動的時候把當前item與另一個item的數據位置交換,再調用RecyclerView的notifyItemMoved()方法刷新布局,同時,因為RecyclerView自帶item動畫,就可以完成上面的交互效果。
  • 左右滑出屏幕時其他item補上
    • 只要在item滑出屏幕時,將對應的數據刪掉,再調用RecyclerView的notifyItemRemoved()方法刷新布局即可。

04.拖拽效果上優化

  • 拖拽效果優化
    • 在item被拖拽或側滑時修改背景色,當動作結束后將背景色恢復回來,而ItemTouchHelper.Callback中正好有對應這兩個狀態的方法,分別是:onSelectedChanged()、clearView()。那么優化處理其實可以放到這兩個方法中處理。
    • 左右滑動使item透明度變淺且縮小該如何實現呢?讓item執行了兩種屬性動畫而已,在ItemTouchHelper.Callback中有一個方法可以拿到item被拖拽或滑動時的位移變化,那就是onChildDraw()方法,在該方法中設置item漸變和縮放屬性動畫。
    • 出現問題,按照上面做法會出現刪除后有空白item留出來,那么為什么會出現這種情況呢?並不是多出了兩條空白數據,它們是正常的數據,只是看不到了,這是因為RecyclerView條目(itemView)覆用導致的,前面在onChildDraw()方法中對itemView設置了透明和縮小,而一個列表中固定只有幾個itemView而已,當那兩個透明縮小的itemView被再次使用時,之前設置的透明度和高度比例已經是0,所以就出現了這種情況,解決方法也很簡單,只要在item被移除后,將itemView的透明度和高度比例設置回來即可

05.完整代碼展示

開源庫地址[融合大多數recyclerView使用案例,可以直接下載demo]:https://github.com/yangchong211/YCRefreshView

  • 00.RecyclerView復雜封裝庫
    • 幾乎融合了該系列博客中絕大部分的知識點,歡迎一遍看博客一遍實踐,一步步從簡單實現功能強大的庫
  • 01.RecyclerView
    • RecycleView的結構,RecyclerView簡單用法介紹
  • 02.Adapter
    • RecyclerView.Adapter扮演的角色,一般常用的重寫方法說明,數據變更通知之觀察者模式,查看.notifyChanged();源碼
  • 03.ViewHolder
    • ViewHolder的作用,如何理解對於ViewHolder對象的數量“夠用”之后就停止調用onCreateViewHolder方法,ViewHolder簡單封裝
  • 04.LayoutManager
    • LayoutManager作用是什么?setLayoutManager源碼分析
  • 05.SnapHelper
    • SnapHelper作用,什么是Fling操作 ,SnapHelper類重要的方法,
  • 06.ItemTouchHelper
  • 07.SpanSizeLookup
    • SpanSizeLookup如何使用,同時包含列表,2列的網格,3列的網格如何優雅實現?
  • 08.ItemDecoration
    • ItemDecoration的用途,addItemDecoration()源碼分析
  • 09.RecycledViewPool
    • RecyclerViewPool用於多個RecyclerView之間共享View。
  • 11.RecyclerView上拉加載
    • 添加recyclerView的滑動事件,上拉加載分頁數據,設置上拉加載的底部footer布局,顯示和隱藏footer布局
  • 12.RecyclerView緩存原理
    • RecyclerView做性能優化要說復雜也復雜,比如說布局優化,緩存,預加載,復用池,刷新數據等等
  • 13.SnapHelper源碼分析
    • SnapHelper旨在支持RecyclerView的對齊方式,也就是通過計算對齊RecyclerView中TargetView 的指定點或者容器中的任何像素點。
  • 16.自定義SnapHelper
    • 自定義SnapHelper
  • 19.自定義ItemDecoration分割線
    • 需要自定義類實現RecyclerView.ItemDecoration類,並選擇重寫合適方法
  • 22.RecyclerView問題匯總
    • getLayoutPosition()和getAdapterPosition()的區別
  • 23.RecyclerView滑動沖突
    • 01.如何判斷RecyclerView控件滑動到頂部和底部
    • 02.RecyclerView嵌套RecyclerView 條目自動上滾的Bug
    • 03.ScrollView嵌套RecyclerView滑動沖突
    • 04.ViewPager嵌套水平RecyclerView橫向滑動到底后不滑動ViewPager
    • 05.RecyclerView嵌套RecyclerView的滑動沖突問題
    • 06.RecyclerView使用Glide加載圖片導致圖片錯亂問題解決
  • 24.ScrollView嵌套RecyclerView問題
    • 要實現在NestedScrollView中嵌入一個或多個RecyclerView,會出現滑動沖突,焦點搶占,顯示不全等。如何處理?

其他介紹

01.關於博客匯總鏈接

02.關於我的博客

代碼案例:https://github.com/yangchong211/YCRefreshView


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM