处理 RecyclerView 中的按下事件

Handling pressed event in RecyclerView

我有包含简单项目的 RecyclerView。我想处理 onPress 事件。如果用户用手指按住项目 2 秒钟,它应该将其移除。但我不知道如何处理延迟。我已经使用 CoroutineScope 来延迟来自 AlertDialog 的回调调用,但这导致了错误。

解决方案:

vh.root.setOnTouchListener { _, event ->
     if (event.action == MotionEvent.ACTION_DOWN){
          launch {
              delay(2000)
              onChosen(true, item.vehicleId, i, this@dialogCustomView)
          }
      }
      true
}

错误:android.view.WindowLeaked: Activity MainActivity has leaked window DecorView@a1d8d91[Item1] that was originally added here

也许setOnLongClickListener可以帮到你。

我不 't know if this is exactly what you want, but here' 我通常做的事情(虽然我大部分时间都使用点击:

class MyAdapter : RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    val myItems = mutableListOf<Item>()

    ....

    override fun onBindViewHolder(holder: MyAdapter.MyViewHolder, position: Int) {
        holder.update(myItems[position], position)
    }

    fun itemTouched(position: Int) {
        myItems.removeAt(position)
        notifyItemRemoved(position)
    }

    inner class MyViewHolder(view: View) : Recyclerview.Viewholder(view) {
        var mPosition = -1
        var mLastTouch: Long = 0

        init {
            view.SetOnTouchListener { _, event ->
            if (event.action == MotionEvent.ACTION_DOWN) {
                mLastTouch = System.currentTimeMillis()

            }else if (event.action == MotionEvent.ACTION_UP) {
                if (System.currentTimeMillis() - lastTouch > 2000) {
                    this@MyAdapter.itemTouched(mPosition)
                }
                mLastTouch = 0
            }
        }
    }
            }
        }

        fun update(item: Item, position: Int) {
            mPosition = position
            //do updates from item
        }
    }
}