У вас есть разные варианты для достижения этой цели - в идеале у нас отключена логика от адаптера, и ваша деятельность должна быть связана с действиями, которые нужно выполнить после того, как пользователь нажмет одну из строк.
Насколько я могу судить, вы определили ViewHolder , который должен ссылаться на ваши представления - верно? Вы можете добавить интерфейс клика элемента так:
class ViewHolder(view : View) : RecyclerView.ViewHolder(view) {
val levelButton : TextView = view.tv_levelButton
interface OnUserAction {
fun onItemClick(item : Item)
}
}
и для того, чтобы запускать его каждый раз, когда пользователь щелкает ячейку - вместо того, чтобы устанавливать его при каждом обновлении представления, вы должны делать это только один раз для onCreateViewHolder :
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(parent.context)
val holder = ViewHolder(inflater.inflate(R.layout.your_layout, parent, false))
holder.onClick {
position, _ -> action.onItemClick(items.get(position))
}
return holder
}
Это действие поле, которое вы видите выше, это интерфейс, отправленный конструктору адаптера:
class ItemsAdapter(val items: List<Item>, private val action: ViewHolder.OnUserAction)...
При этом для вызова определенного действия в вашей деятельности / фрагменте вам просто нужно реализовать созданный интерфейс - OnUserAction :
override fun onItemClick(item: Item) {
var gotoLevel = getLevel(item)
context.startActivity(gotoLevel)
}
Edit:
Чтобы упростить задачу, я создал функцию расширения OnClick:
fun <T : RecyclerView.ViewHolder> T.onClick(event: (position: Int, type: Int) -> Unit): T {
itemView.setOnClickListener {
event.invoke(adapterPosition, itemViewType)
}
return this
}