繁体   English   中英

Kotlin android 中的 RecyclerView itemClickListener

[英]RecyclerView itemClickListener in Kotlin android

我正在用 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 上设置侦听器的最佳方式吗?

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

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 = {
            
        }
    }
    
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM