ItemTouchHelper是一个工具类,方便我们对RecyclerView的item进行拖拽,做侧滑删除用它是不是就很方便了,连Scroller都不用了,有时真的是思路为王啊。
import android.graphics.Canvas
import android.widget.TextView
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
class DoraDragItemCallback(private val adapter: DoraDragItemAdapter) : ItemTouchHelper.Callback() {
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
): Int {
val canDrag = adapter.canDrag(viewHolder.adapterPosition)
val canLeftSwipe = adapter.canLeftSwipe(viewHolder.adapterPosition)
val canRightSwipe = adapter.canRightSwipe(viewHolder.adapterPosition)
val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
val swipeFlags = (if(canLeftSwipe) ItemTouchHelper.START else 0) or
(if(canRightSwipe) ItemTouchHelper.END else 0)
return makeMovementFlags(if (canDrag) dragFlags else 0, swipeFlags)
}
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
adapter.onItemMove(viewHolder.adapterPosition, target.adapterPosition)
return true
}
override fun getMoveThreshold(viewHolder: RecyclerView.ViewHolder): Float {
return 0f
}
override fun canDropOver(recyclerView: RecyclerView, current: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
if (target.adapterPosition == 0) {
return false
}
return super.canDropOver(recyclerView, current, target)
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
adapter.onItemRemove(viewHolder.adapterPosition)
}
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 (isCurrentlyActive) {
if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
onDragStart(viewHolder)
}
} else {
onDragEnd(viewHolder)
}
}
private fun onDragStart(viewHolder: RecyclerView.ViewHolder) {
val textView = viewHolder.itemView.findViewById<TextView>(android.R.id.text1)
// 放大20%
textView.scaleX = 1.2f
textView.scaleY = 1.2f
}
private fun onDragEnd(viewHolder: RecyclerView.ViewHolder) {
val textView = viewHolder.itemView.findViewById<TextView>(android.R.id.text1)
// 还原
textView.scaleX = 1f
textView.scaleY = 1f
}
}
getMovementFlags:告诉框架该item能否上下拉,能否左右滑动
getMoveThreshold:item上下滑动多少才算拖动
onMove:item被上下移动重新排序后回调
canDropOver:告诉框架被拉起来上下调整位置的item能否落到该位置上
onSwiped:item被左右滑动删除后回调
onChildDraw:告诉框架怎么画item的子控件,在这里可以让子控件发生一些变化
val adapter = DoraDragItemAdapter()
val touchHelper = ItemTouchHelper(DoraDragItemCallback(adapter))
touchHelper.attachToRecyclerView(recyclerView)
将ItemTouchHelper依附到RecyclerView上。
阅读量:1045
点赞量:0
收藏量:0