处理 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
}
}
}
我有包含简单项目的 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
}
}
}