Android – Kotlin: el object debe declararse abstracto o implementar miembro abstracto

He establecido un ItemClickLister para mi RecyclerView así:

ItemClickSupport.addTo(recyclerView!!).setOnItemClickListener( object : ItemClickSupport.OnItemClickListener { override fun onItemClicked(recyclerView: RecyclerView?, position: Int, v: View?) { val row = recyclerView!!.getChildAt(position) val el = row.findViewById(R.id.active_expandablelayout) as ExpandableLayout if (el.isExpanded) { el.collapse() } else { el.expand() } } } ) 

usando la biblioteca ItemClickSupport que traduje a Kotlin.

Aparece un error en el object (línea 2) que dice:

el object debe declararse abstracto o implementar miembro abstracto.

Soy realmente nuevo en Kotlin y no pude encontrar ninguna solución aquí en SO tampoco.

Cualquier ayuda es muy apreciada.

Editar:

Aquí está mi ItemClickSupport.kt :

 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 } } } 

Esta es una captura de pantalla con todo el error y dónde sucede:

captura de pantalla

Sus firmas de interfaz y método no coinciden. Su interfaz declara una function como:

 fun onItemClicked(recyclerView: RecyclerView, position: Int, v: View) 

Y lo anulas como:

 fun onItemClicked(recyclerView: RecyclerView?, position: Int, v: View?) 

Esas no son las mismas firmas de método.

Si se trata de una interfaz Java, puede sobrescribir al cambiar la capacidad de anulación porque no está claro qué es la nulabilidad (dado que no hay annotations en el código de Java). Pero como lo transfirió a una interfaz de Kotlin, debe anular el uso de la misma firma exacta. ¿En su lugar, hizo ambos RecyclerView? y View? nullable que resulta en una falta de coincidencia con la firma original. Cambie su function anulada para ser:

 override fun onItemClicked(recyclerView: RecyclerView, position: Int, v: View) 

Como se trata de una interfaz de Kotin, no puede usar la conversión de SAM a un Lambda, por lo que la otra respuesta proporcionada anteriormente no funciona. Si esta era una interfaz Java, podrías hacer eso. Puede realizar un seguimiento de las conversiones de SAM para las interfaces de Kotlin en KT-7770 .

Si quisieras que este código fuera más idiomático que Kotlin, querrías references a funciones o lambdas en lugar de interfaces, y deberías hacerlo en lugar de confiar en la conversión de SAM. Puedes leer más sobre eso en Funciones de order superior y Lambdas . Esto está fuera del scope de su pregunta para entrar en más detalles.

Prueba con esto:

 ItemClickSupport.addTo(listView).setOnItemClickListener(object : ItemClickSupport.OnItemClickListener{ override fun onItemClicked(recyclerView: RecyclerView, position: Int, v: View) { val row = recyclerView!!.getChildAt(position) val el = row.findViewById(R.id.active_expandablelayout) as ExpandableLayout if (el.isExpanded) { el.collapse() } else { el.expand() } } }) 
  • Actualizando la Vista de Reciclador y Creando Parcelables para la rotation de la pantalla (¿Cuál es el mejor curso de acción aquí?)
  • kotlin RecyclerViewAdapter IndexOutOfBoundException
  • extensiones kotlin-android en ViewHolder
  • ¿Por qué onclick en los ítems de RecyclerView se devuelve una identificación de artículo incorrecta?
  • Desadaptación del tipo de Kotlin: ¡tipo inferido es Ver! pero se esperaba TextView
  • Recyclerview: escucha los events de clic de relleno
  • Intentando crear un reciclador simple en Kotlin, pero el adaptador no se está aplicando correctamente
  • Cómo proteger el oyente de desplazamiento sin fin de un reciclador
  • ¿Cómo uso un onItemLongClickListener en mi actividad en Android?
  • ReciclarVer list de elementos que no aparecen
  • La image no se muestra en Recyclerview usando Glide