Почему функция обработки щелчка должна передаваться из инициализации адаптера?

#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()» ВНУТРИ класса адаптера, то будет трудно взаимодействовать (при необходимости) с чем-либо ЗА ПРЕДЕЛАМИ этого адаптера. На самом деле обычно принято отмечать расширенный класс адаптера (ваш «метаадаптер») как СТАТИЧЕСКИЙ из-за лучшей производительности и меньшего потребления памяти. Если класс статичен, вы не будете «касаться» ничего за пределами адаптера, потому что интерфейс пользователя обычно создается в одном объекте (Действие, Фрагмент и т. Д.), Но если вы передадите функцию в качестве аргумента, она может быть создана отовсюду.