Котлин – ожидание объявления участника

Я пытался конвертировать приложение из Java в Kotlin.

Я использовал встроенный конвертер Android Studio и исправил большую часть ошибок, которые он сгенерировал.

Будучи новичком в Котлине, мне это очень тяжело:

Я получил этот класс, который был написан на Java и преобразован, по-видимому, без ошибок, что помогает мне управлять щелчками элементов в RecyclerView :

 class ItemClickSupport private constructor(private val mRecyclerView: RecyclerView) { private var mOnItemClickListener: OnItemClickListener? = null private var mOnItemLongClickListener: OnItemLongClickListener? = null private val mOnClickListener = View.OnClickListener { v -> if (mOnItemClickListener != null) { val holder = mRecyclerView.getChildViewHolder(v) mOnItemClickListener!!.onItemClicked(mRecyclerView, holder.adapterPosition, v) } } private val mOnLongClickListener = View.OnLongClickListener { v -> if (mOnItemLongClickListener != null) { val holder = mRecyclerView.getChildViewHolder(v) return@OnLongClickListener mOnItemLongClickListener!!.onItemLongClicked(mRecyclerView, holder.adapterPosition, v) } false } private val mAttachListener = object : RecyclerView.OnChildAttachStateChangeListener { override fun onChildViewAttachedToWindow(view: View) { if (mOnItemClickListener != null) { view.setOnClickListener(mOnClickListener) } if (mOnItemLongClickListener != null) { view.setOnLongClickListener(mOnLongClickListener) } } override fun onChildViewDetachedFromWindow(view: View) { } } init { mRecyclerView.setTag(R.id.item_click_support, this) mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener) } fun setOnItemClickListener(listener: OnItemClickListener): ItemClickSupport { mOnItemClickListener = listener return this } fun setOnItemLongClickListener(listener: OnItemLongClickListener): ItemClickSupport { mOnItemLongClickListener = listener return this } private fun detach(view: RecyclerView) { view.removeOnChildAttachStateChangeListener(mAttachListener) view.setTag(R.id.item_click_support, null) } interface OnItemClickListener { fun onItemClicked(recyclerView: RecyclerView, position: Int, v: View) } interface OnItemLongClickListener { fun onItemLongClicked(recyclerView: RecyclerView, position: Int, v: View): Boolean } companion object { fun addTo(view: RecyclerView): ItemClickSupport { var support: ItemClickSupport? = view.getTag(R.id.item_click_support) as ItemClickSupport if (support == null) { support = ItemClickSupport(view) } return support } fun removeFrom(view: RecyclerView): ItemClickSupport? { val support = view.getTag(R.id.item_click_support) as ItemClickSupport support?.detach(view) return support } } } 

В основном случае после преобразования он устанавливается так же в функции onCreate :

 ItemClickSupport.addTo(recyclerView!!).setOnItemClickListener { recyclerView, position, v -> val itemIntent = Intent(this@AddSubscription, CreateSubscription::class.java) ... } 

IDE дает мне следующую ошибку:

Несоответствие типов:

требуется: ItemClickSupport.OnItemClickListener

Найдено: (???, ???, ???) -> Единица

Теперь я знаю, что Unit – это void Котлина, но я не могу понять, где ошибка.

После проверки этого ответа, как было предложено, я написал следующий код:

 ItemClickSupport.addTo(recyclerView!!).setOnItemClickListener( object: ItemClickSupport.OnItemClickListener { val itemIntent = Intent(this@AddSubscription, CreateSubscription::class.java) val bundle = Bundle() bundle.putParcelable("selected", filteredList!![position]) itemIntent.putExtras(bundle) startActivity(itemIntent) }) 

Теперь я получаю

ожидаемая декларация участника

который, как указано в этом другом ответе, имеет отношение к конструктору.

Является ли это конструктором ItemClickSupport.OnItemClickListener? Если да, то что я должен изменить?

Я подозреваю, что ошибка по-прежнему вызвана тем, что класс OnClickSupport плохо преобразован в kotlin, даже если у него нет никаких синтаксовых ошибок

Поскольку вы конвертировали оба файла в Kotlin, и поскольку интерфейс OnItemClickListener написан в Kotlin, вы не можете передавать функцию lambda. Лучший способ – создать анонимный экземпляр интерфейса (вы также можете использовать lambda для этого, но я отправляю без лямбда ради понимания)

 ItemClickSupport.addTo(recyclerView!!) .setOnItemClickListener (object:OnItemClickListener{ override fun onItemClicked(recyclerView: RecyclerView, position: Int, v: View ){ val itemIntent = Intent(this@AddSubscription, CreateSubscription::class.java) ... } }) 

Кроме того, вы можете использовать функцию HighOrder внутри ItemClickSupport чтобы получать только лямбда и избегать интерфейса.

Intereting Posts
Репликация Котлина Фрагмент: изменение видимости в функции TornadoFX – удалить элемент с помощью контекстного меню правой кнопкой мыши Почему первое вычисление в приложении для Android медленное, а все последующие вычисления быстры kotlin 1.1.4 примитивы в родовом классе Kotlin: нельзя использовать GenericTypeIndicator для вызова getBalue базы данных Firebase isInitialized – Поле поддержки lateinit var недоступно на данный момент Android Kotlin передает значение с текстовых полей на numberPicker Функция расширения Kotlin Котлин объединяет два изменяемых значения с возможностью смены имени kotlin, вызывающий мутирующую функцию в делеризации класса Как плоская карта над списком объектов, которые могут иметь пустую коллекцию Kotlin Один аргумент типа, ожидаемый для класса для абстрактного общего владельца представления android TabLayout установить значок с сервера Kotlin: Можете ли вы использовать именованные аргументы для varargs?