项目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) } }
关闭顶部。 上面代码的一些可选的改进
-
为lambda创建typealias。 使您的代码更具可读性。
typealias MyCategoryClickListener = (View, Category) -> Unit class CategoryAdapter( private val categoryList: List
, private val context: Context, private val onClickListener: MyCategoryClickListener ) : RecyclerView.Adapter () { -
忽略
invoke
侦听器的invoke
。 Lambda可以像函数一样被调用。holder.itemView.setOnClickListener { view -> onClickListener(view, category) }
-
创建适配器时,将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 } }
- 与Kotlin一起使用Instant Run时发生IllegalAccessError
- 我现在正在用Kotlin开发一个Android应用程序,但是发生了一个错误:CompilationException:无法将方法调用“readText”内联到
- 在Android Studio中Kotlin构建失败
- 在Kotlin Android中出现错误“未解决的参考”
- Java和Kotlin组合生成错误(重复邮编条目)
- Kotlin:以函数的forms传递对象作为参考,并改变它的实例
- 在android studio中使用main函数运行单个kotlin类
- kotlin是function性的还是程序性的?
- 为什么我们编写NextActivity :: class.java,尽管这是一个kotlin类?