九宮格圖片布局,長按直接拖拽圖片,長按時顯示底部洗掉布局,拖拽到洗掉布局處松手可洗掉布局,最后添加按鈕不可拖拽,基于 BaseQuickAdapter 基礎上實作

BaseQuickAdapter 確實很好用,簡化我們的實作代碼,它本身也集成了一套拖拽實作,不過目前無法完美的滿足上面的需求,需要做一些修改
1、首先自定義好九宮格布局,末尾是一個 + 號,這個加號無法拖拽,這里 + 號最好是用圖片,更方便
2、在 adapter 中重寫 addDraggableModule 方法,這里我直接自定義了自己的 DraggableModule ,因為我需要替換默認的監聽事件,達到我自己的目的

核心邏輯就集中在 PhotoDraggableModule 中,否則自帶的拖拽沒發監聽拖拽的距離,不好計算是否拖拽到了底部
原始碼中在 module 初始化的時候就已經把監聽初始化了,所以在不替換的情況下,很難達到自己的需求

其實就是 DragAndSwipeCallback ,自己定義有點麻煩,還不如不用這套拖拽封裝了,所以為了簡化,只能繼續用它,在它的基礎上計算自己的拖拽距離就行了
直接在 module 中的 init 方法里 重新創建監聽,去替換原有的 callback,這樣就方便自己獲取資料操作了
init { itemTouchHelperCallback = object : DragAndSwipeCallback(this) { override fun onChildDraw( c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean ) { super.onChildDraw( c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive ) if (callBack == null) return if (isCurrentlyActive) { viewHolder.itemView.visibility = View.VISIBLE if (dY.toInt() == 0) { isDel = false callBack?.touchStart() } else if (dY > 0) { //拖到指定區域 val bottom = (recyclerView.parent.parent as View).bottom + dY val bottomY = bottom - (recyclerView.bottom - viewHolder.itemView.bottom) - (scrollView?.scrollY ?: 0) //是否在洗掉區域 isDel = bottomY >= bottomDelTopY callBack?.touchMove(isDel) } } else { val delPosition = if (isDel) viewHolder.layoutPosition else null //松開先隱藏,預防松開后item回到串列在執行洗掉影片 viewHolder.itemView.visibility = if (isDel) View.INVISIBLE else View.VISIBLE callBack?.touchUp(delPosition) isDel = false } } @SuppressLint("NotifyDataSetChanged") override fun clearView( recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder ) { super.clearView(recyclerView, viewHolder) viewHolder.itemView.visibility = View.VISIBLE //等待布局操作結束執行重繪,避免下方例外 //Cannot call this method while RecyclerView is computing a layout or scroll viewHolder.itemView.post { baseQuickAdapter.notifyDataSetChanged() } } } itemTouchHelper = ItemTouchHelper(itemTouchHelperCallback) }
3、計算拖拽距離
如果沒有被 scrollView 嵌套,直接通過拖拽的距離就能判斷是否到底部了,但是一般情況下都需要你可滑動,就會需要嵌套一層 scrollVIew
根據上面代碼看出,其實就是需要獲取 scrollView 的滾動距離,從中得出你拖拽的距離是否到底部了,這里用 isDel 來控制執行次數,否則會重復呼叫多次
4、最后在回呼監聽中處理拖拽的影片和洗掉操作
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/544670.html
標籤:其他
