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.

  • DiffUtils y multi selección
  • ¿Cómo agregar un oyente Onclick en un RecyclerView en Android Studio con Kotlin?
  • Haga que los niños de RecyclerView coincidan con la altura de los padres cuando usan el constructor en lugar de inflar para crearlos
  • Kotlin || El elemento Recycleview no está inflando: código inalcanzable en cada método reemplazado de RecycleView.Adapter
  • ReciclarVer list de elementos que no aparecen
  • ¿Cómo agregar una image más como un button al final de mi RecyclerView en Android?
  • kotlin, android, fragment, vacío, reciclador, vista, después, espalda
  • java.lang.IllegalStateException: TextView no debe ser nulo (Android / Kotlin)
  • RecyclerView Items no aparece hasta que lo desploop
  • Cómo restablecer el contenido de la vista de reciclador en la actividad de llamadas usando Kotlin
  • Cómo implementar un reciclador de carga perezosa. Adaptador de vista como el reciclador de reino. Ver el adaptador usando kotlin.