#android #kotlin #android-recyclerview #onclicklistener
Вопрос:
Это вопрос, который поможет понять. У меня есть recyclerview, и после больших усилий я, наконец, смог обработать щелчок по элементу в окне recyclerview. Это было трудно, потому что я не вижу логики в том, как это делается. Вот несколько фрагментов кода:
В режиме основной активности инициализация адаптера:
// Adapter takes a lambda function as a parameter - this will go through to what happens onClick
val adapter = MetarItemAdapter{
a: String -> u.l(this, a)
}
В классе адаптера инициализация класса с требуемой лямбда-функцией, теперь называемой onClick:
class MetarItemAdapter(
private val onClick: (String) -> Unit
) : RecyclerView.Adapter<MetarItemAdapter.MetarViewHolder>() {
...rest of adapter code
В onBindViewHolder вот как я использовал onClick:
override fun onBindViewHolder(holder: MetarViewHolder, position: Int) {
val currentItem = metarList[position]
holder.tvMetar.text = currentItem.metar
holder.tvMetar.setOnClickListener {
onClick(holder.tvMetar.text.toString())
}
}
Рассмотрев множество вопросов о переполнении стека, я понял, что это способ обработки щелчка в окне просмотра вторсырья.
Мой вопрос в том, почему мы должны определять функцию полностью в основной деятельности, чтобы она требовалась для инициализации класса, чтобы она была доступна во всем классе, чтобы ее можно было использовать только для простой обработки щелчков в onBindViewHolder? Почему код для обработки клика не может содержаться только в onBindViewHolder?
Спасибо за чтение, надеюсь, в этом есть смысл. Рад прояснить любые моменты.
Ответ №1:
Вы можете поместить функцию туда, куда хотите, но она должна быть доступна из метода «Adapter.onBindViewHolder ()».
Если вы разместите свою лямбду «onClick()» ВНУТРИ класса адаптера, то будет трудно взаимодействовать (при необходимости) с чем-либо ЗА ПРЕДЕЛАМИ этого адаптера. На самом деле обычно принято отмечать расширенный класс адаптера (ваш «метаадаптер») как СТАТИЧЕСКИЙ из-за лучшей производительности и меньшего потребления памяти. Если класс статичен, вы не будете «касаться» ничего за пределами адаптера, потому что интерфейс пользователя обычно создается в одном объекте (Действие, Фрагмент и т. Д.), Но если вы передадите функцию в качестве аргумента, она может быть создана отовсюду.