项目Onclick RecyclerView Kotllin Android

我在Kotlin中有RecyclerView适配器,当用户点击categoryPhoto时,我想打开一个新的活动。 我应该如何执行这个?

class CategoryAdapter(private val categoryList: List, private val context: Context) : RecyclerView.Adapter() { class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) { var categoryName = view.text_view_category_name var categoryPhoto = view.image_view_category var cardView = view.card_view_category } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = MyViewHolder(parent.inflate(R.layout.category_list_row)) override fun onBindViewHolder(holder: MyViewHolder, position: Int) { val category = categoryList[position] // Set height of cardview based on screen width val displayMetrics = context.resources.displayMetrics val finalHeight = displayMetrics.widthPixels / 2 holder.cardView.layoutParams.height = finalHeight holder.categoryName.text = category.oc holder.categoryPhoto.loadUrl(category.icon) } override fun getItemCount(): Int { return categoryList.size }} 

只需将点击侦听器作为参数添加到适配器的构造函数即可。

 class CategoryAdapter( private val categoryList: List, private val context: Context, private val onClickListener: (View, Category) -> Unit ) : RecyclerView.Adapter() { ... override fun onBindViewHolder(holder: MyViewHolder, position: Int) { val category = categoryList[position] // Set height of cardview based on screen width ... holder.itemView.setOnClickListener { view -> onClickListener.invoke(view, category) } } ... } 

那么你可以使用如下:

 fun initList() { adapter = CategoryAdapter( categoryList = ..., context = ..., onClickListener = { view, category -> openActivity(view, category) } } 

关闭顶部。 上面代码的一些可选的改进

  1. 为lambda创建typealias。 使您的代码更具可读性。

     typealias MyCategoryClickListener = (View, Category) -> Unit class CategoryAdapter( private val categoryList: List, private val context: Context, private val onClickListener: MyCategoryClickListener ) : RecyclerView.Adapter() { 
  2. 忽略invoke侦听器的invoke 。 Lambda可以像函数一样被调用。

     holder.itemView.setOnClickListener { view -> onClickListener(view, category) } 
  3. 创建适配器时,将lambda替换为引用

      fun initList() { adapter = CategoryAdapter( categoryList = ..., context = ..., onClickListener = this::openActivity) } fun openActivity(view: View, category: Category) { ... } 

你可以在你的onBindViewHolder(…)

 override fun onBindViewHolder(holder: MyViewHolder, position: Int) { val category = categoryList[position] // Set height of cardview based on screen width val displayMetrics = context.resources.displayMetrics val finalHeight = displayMetrics.widthPixels / 2 holder.cardView.layoutParams.height = finalHeight holder.categoryName.text = category.oc holder.categoryPhoto.loadUrl(category.icon) holder.categoryPhoto.setOnClickListener { view -> // categoryPhoto clicked. // start your activity here } }