美文网首页
RecyclerView GridLayoutManager i

RecyclerView GridLayoutManager i

作者: Ello_Orld | 来源:发表于2021-06-07 08:34 被阅读0次

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)
    }
}
20210604_113409.png 20210604_113441.png

相关文章

网友评论

      本文标题:RecyclerView GridLayoutManager i

      本文链接:https://www.haomeiwen.com/subject/kojxeltx.html