Kotlin android中的RecyclerView itemClickListener

Posted

技术标签:

【中文标题】Kotlin android中的RecyclerView itemClickListener【英文标题】:RecyclerView itemClickListener in Kotlin android 【发布时间】:2020-12-31 04:11:18 【问题描述】:

我正在用 Kotlin 编写一个应用程序 但对如何在 Kotlin 中使用带有 RecyclerView 的 itemClickListener 感到困惑。

这是我的自定义监听器

class RecyclerTouchListener(
context: Context?,
recycleView: RecyclerView,
private val clicklistener: ClickListener?) : OnItemTouchListener 
private val gestureDetector: GestureDetector
override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean 
    val child = rv.findChildViewUnder(e.x, e.y)
    if (child != null && clicklistener != null && gestureDetector.onTouchEvent(e)) 
        clicklistener.onClick(child, rv.getChildAdapterPosition(child))
    
    return false


override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) 
override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) 

interface ClickListener 
    fun onClick(view: View?, position: Int)
    fun onLongClick(view: View?, position: Int)


init 
    gestureDetector = GestureDetector(context, object : SimpleOnGestureListener() 
        override fun onSingleTapUp(e: MotionEvent): Boolean 
            return true
        

        override fun onLongPress(e: MotionEvent) 
            val child = recycleView.findChildViewUnder(e.x, e.y)
            if (child != null && clicklistener != null) 
                clicklistener.onLongClick(child, recycleView.getChildAdapterPosition(child))
            
        
    )
 //end RecyclerTouchListener class

我尝试在我的 MainActivity 类中使​​用它

class MainActivity : AppCompatActivity() 

val list:ArrayList<Item> = ArrayList()
val myAdapter =ItemRcyclerAdapter(this , fillItemArray())

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    var layoutManager = LinearLayoutManager(this)
    val main_item_recycler: RecyclerView= findViewById(R.id.main_item_recycler)

    main_item_recycler.adapter=myAdapter
    main_item_recycler.setHasFixedSize(true)
    main_item_recycler.setLayoutManager(layoutManager)

    main_item_recycler.addOnItemTouchListener(RecyclerTouchListener(
        this,main_item_recycler, RecyclerTouchListener.ClickListener()
      
          ))
//end onCreate()

但是在 RecyclerTouchListener 构造函数中我不能传递这个参数“RecyclerTouchListener.ClickListener()”对

如何覆盖 ClickListener 接口方法? 它是在 recyclerView 上设置监听器的最佳方式吗?

【问题讨论】:

为什么要用触摸监听器来实现它?有什么理由你没有在 RecyclerViewAdapter 中实现你的点击监听器 我不太清楚我为什么使用这种方法,我在网上寻找解决方案,找到了。你知道我们可能使用这种方法而不是另一种的原因是什么吗? 【参考方案1】:

您可以在适配器内实现点击侦听器,而不是实现手势检测器来获取子视图。 我添加了示例代码,您可以查看如何实现它:

class YourAdapter: RecyclerView.Adapter<YourAdapter.YourViewHolder>() 
    
    var items: List<YourItem> = emptyList()
    
    var onItemClicked: ((tem: YourItem) -> Unit)? = null

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): YourViewHolder 
        // Create your View Holder
    

    override fun getItemCount(): Int = items.size

    override fun onBindViewHolder(holder: YourViewHolder, position: Int) 
        holder.bind(items[holder.adapterPosition])
    

    inner class YourViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) 
        fun bind(item: YourItem) 
            itemView.setOnClickListener  
                onItemClicked?.invoke(item)
            
        

    


data class YourItem(
        val id: Int,
        val name: String
)

class YourActivity: Activity() 

    val adapter = YourAdapter()
    
    override fun onStart() 
        super.onStart()
        adapter.items = // Set your data
        adapter.onItemClicked = 
            
        
    
    

【讨论】:

我不太清楚我为什么使用这种方法,我在网上寻找解决方案,找到了。你知道我们可能使用这种方法而不是另一种方法的原因是什么吗? @YousefAwad 这是一种更好的方法,也是最佳实践。因为您正在用数据填充视图,并且您可以通过位置访问它们

以上是关于Kotlin android中的RecyclerView itemClickListener的主要内容,如果未能解决你的问题,请参考以下文章

android 11 kotlin 中的包可见性

如何在 Android (Kotlin) 中的 onSuccessListener 之外分配位置坐标?

如何使用 Kotlin 在 android 中的 BottomNavigationView 上设置 OnNavigationItemListener?

Kotlin android中的RecyclerView itemClickListener

Xamarin 是不是支持 Xamarin Android 绑定库中的 Kotlin 协程?

Kotlin 在 Android 开发中的 16 个建议