MainActivity
class MainActivity : AppCompatActivity() {
private lateinit var recyclerView: RecyclerView
private lateinit var tvDel: TextView
private lateinit var adapter: PictureAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recyclerView = findViewById(R.id.recyclerView)
tvDel = findViewById(R.id.tvDel)
val list = listOf(
Picture(R.drawable.a1),
Picture(R.drawable.a2),
Picture(R.drawable.a3),
Picture(R.drawable.a4),
Picture(R.drawable.a5)
)
adapter = PictureAdapter(this, list.toMutableList())
recyclerView.layoutManager = GridLayoutManager(this, 4)
recyclerView.adapter = adapter
adapter.listener = object : OnPictureItemClickListener {
override fun onItemClick(view: View, position: Int) {
Toast.makeText(this@MainActivity, "$position", Toast.LENGTH_SHORT).show()
}
}
var deleteFlag = false
val itemTouchHelper =
ItemTouchHelper(PictureItemTouchCallback(adapter) { view, position, _, dy, isDragging ->
if (tvDel.top - dy - recyclerView.top - view.bottom > 0) {
tvDel.text = "拖动到此处删除"
if (isDragging != tvDel.isVisible) {
tvDel.isVisible = isDragging
}
} else {
tvDel.text = "松手删除"
if (!isDragging) {
if (deleteFlag) {
return@PictureItemTouchCallback
}
deleteFlag = true
adapter.list.removeAt(position)
adapter.notifyItemRemoved(position)
adapter.notifyItemRangeChanged(position, adapter.list.size)
tvDel.postDelayed({
tvDel.isVisible = false
}, 500)
}else{
deleteFlag = false
tvDel.isVisible = isDragging
}
}
})
itemTouchHelper.attachToRecyclerView(recyclerView)
}
}
PictureItemTouchCallback
class PictureItemTouchCallback(
private val adapter: PictureAdapter,
val onDrag: (view: View, position: Int, dx: Float, dy: Float, isDragging: Boolean) -> Unit
) :
ItemTouchHelper.Callback() {
//是否触摸
private var isTouchDown: Boolean = false
override fun isLongPressDragEnabled(): Boolean {
return super.isLongPressDragEnabled()
}
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
): Int {
//那些方向可以滑动
return makeMovementFlags(UP or DOWN or LEFT or RIGHT, 0)
}
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
Log.d("dxl1", "onMove")
val fromPosition = viewHolder.bindingAdapterPosition
val targetPosition = target.bindingAdapterPosition
//不允许移动的位置可以返回false
// return false
return true
}
override fun onMoved(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
fromPos: Int,
target: RecyclerView.ViewHolder,
toPos: Int,
x: Int,
y: Int
) {
Log.d("dxl1", "onMoved x=$x, y=$y")
super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y)
if (fromPos < toPos) {
for (i in fromPos until toPos) {
Collections.swap(adapter.list, i, i + 1)
}
} else {
for (i in toPos downTo fromPos + 1)
Collections.swap(adapter.list, i, i - 1)
}
adapter.notifyItemMoved(fromPos, toPos)
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
Log.d("dxl1", "onSwiped")
}
override fun onChildDraw(
c: Canvas,
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
dX: Float,
dY: Float,
actionState: Int,
isCurrentlyActive: Boolean
) {
onDrag(viewHolder.itemView, viewHolder.bindingAdapterPosition, dX, dY, isTouchDown)
//view在移动
Log.d(
"dxl1",
"dx=$dX, dy=$dY,pos=${viewHolder.bindingAdapterPosition}, isTouchDown = $isTouchDown"
)
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
}
override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
super.clearView(recyclerView, viewHolder)
Log.d("dxl1", "clearView")
//移动结束,view已经回到新位置上了
//将view 的不透明度设置回来
viewHolder.itemView.alpha = 1.0f
}
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
super.onSelectedChanged(viewHolder, actionState)
if (actionState == ACTION_STATE_DRAG) {
if (viewHolder != null) {
//开始拖动
isTouchDown = true
//长按开始准备拖动时,将view设置一个透明度
viewHolder.itemView.alpha = 0.6f
}
}
if (actionState == ACTION_STATE_IDLE) {
//松开手了
isTouchDown = false
}
Log.d("dxl1", "onSelectedChanged $actionState")
}
override fun getAnimationDuration(
recyclerView: RecyclerView,
animationType: Int,
animateDx: Float,
animateDy: Float
): Long {
Log.d("dxl1", "getAnimationDuration")
//拖动松手,view将移动到新位置上
return super.getAnimationDuration(recyclerView, animationType, animateDx, animateDy)
}
}
PictureAdapter
class PictureAdapter(private val context: Context, val list: MutableList<Picture>) :
RecyclerView.Adapter<PictureAdapter.MyViewHolder>() {
var listener: OnPictureItemClickListener? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
return MyViewHolder(
LayoutInflater.from(context)
.inflate(R.layout.item_main, parent, false) as SquareImageView
)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.squareImageView.setImageResource(list[position].resourceId)
holder.squareImageView.setOnClickListener {
listener?.onItemClick(it, position)
}
}
override fun getItemCount(): Int {
return list.size
}
inner class MyViewHolder(val squareImageView: SquareImageView) :
RecyclerView.ViewHolder(squareImageView)
}
Picture
data class Picture(@DrawableRes val resourceId: Int)
SquareImageView
class SquareImageView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : AppCompatImageView(context, attrs, defStyleAttr) {
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, widthMeasureSpec)
}
}
![](https://img.haomeiwen.com/i1354674/22c0488a91ed92a5.png)
![](https://img.haomeiwen.com/i1354674/3309cede7629e9c7.png)
网友评论