Kotlin: esperando la statement de un miembro

Intentaba convertir mi aplicación de Java a Kotlin.

Utilicé el convertidor incorporado de Android Studio y solucioné la mayoría de los errores que generaba.

Ser nuevo en Kotlin me está resultando realmente difícil:

Obtuve esta class que estaba escrita en Java y se convirtió, aparentemente sin ningún error, lo que me ayuda a administrar clics de elementos en un 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 } } } 

En la actividad principal, después de la conversión se establece así en la function onCreate :

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

El IDE me está dando el siguiente error:

Tipo desajuste:

requerido: ItemClickSupport.OnItemClickListener

Encontrado: (???, ???, ???) -> Unidad

Ahora, sé que Unit es el void de Kotlin, pero no puedo descubrir dónde está el error.

Después de marcar esta respuesta como se sugirió, escribí el siguiente código:

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

Ahora estoy obteniendo un

statement de miembro esperada

que como se indica en esta otra respuesta , tiene que ver con el constructor.

¿Es este el constructor ItemClickSupport.OnItemClickListener? Si es así, ¿qué debería cambiar?

Sospecho que el error todavía es causado por la class OnClickSupport se convierte mal en kotlin, incluso si no tiene ningún error syntax

Como ha convertido ambos files a Kotlin y como la interfaz OnItemClickListener está escrita en Kotlin, no puede pasar una function lambda así. La mejor manera es crear una instancia anónima de la interfaz (también puedes usar lambda para eso, pero estoy publicando sin lambda para tu comprensión)

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

Alternativamente, puede usar la function HighOrder dentro de ItemClickSupport para recibir solo lambda y evitar la interfaz.

  • Android solo estableceStackFromEnd solo si RecycleView / List es más grande que la pantalla
  • My RecyclerView no se notifica adecuadamente
  • Android Recycler View Horizontal Desplácese hasta el último elemento y muestre el primer elemento
  • RecyclerView.ViewHolder no se vincula correctamente
  • RecyclerView animation de elementos, se llama AnimationFinished, pero no está activado en AnimationStarted. ¿Por qué?
  • Extensión de Kotlin no reconocida en el adaptador
  • RecyclerView: implementa correctamente la eliminación de SnackBar UNDO (Kotlin)
  • Intentando crear un reciclador simple en Kotlin, pero el adaptador no se está aplicando correctamente
  • ¿Cómo agregar una image más como un button al final de mi RecyclerView en Android?
  • Desadaptación del tipo de Kotlin: ¡tipo inferido es Ver! pero se esperaba TextView
  • Haga que los niños de RecyclerView coincidan con la altura de los padres cuando usan el constructor en lugar de inflar para crearlos