Android – Kotlin – объект должен быть объявлен абстрактным или реализовать абстрактный элемент

Я установил ItemClickLister для моего RecyclerView следующим образом:

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

используя библиотеку ItemClickSupport, которую я перевел в Котлин.

Я получаю сообщение об ошибке на object (строка 2), в котором говорится:

объект должен быть объявлен абстрактным или реализовать абстрактный элемент.

Я действительно новичок в Kotlin, и я тоже не мог найти решения на SO.

Любая помощь приветствуется.

Редактировать:

Вот мой 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 } } } 

Это скриншот со всей ошибкой и где это происходит:

Скриншот

Подписи вашего интерфейса и метода не совпадают. Ваш интерфейс объявляет одну функцию следующим образом:

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

И вы переопределяете его как:

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

Это не те же подписи метода.

Если это был интерфейс Java, вы можете переопределить его, изменив значение NULL, потому что неясно, что такое неопределенность (без аннотаций в коде Java). Но поскольку вы портировали его на интерфейс Kotlin, вы должны переопределить использование той же точной подписи. Вы вместо этого сделали и RecyclerView? и View? nullable, что приводит к несоответствию исходной подписи. Измените переопределенную функцию:

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

Поскольку это интерфейс Kotin, вы не можете использовать преобразование SAM в Lambda, поэтому другой предоставленный ранее ответ не работает. Если бы это был интерфейс Java, вы могли бы это сделать. Вы можете отслеживать конверсии SAM для интерфейсов Kotlin в KT-7770 .

Если вы хотите, чтобы этот код был более идиоматичным Kotlin, вам нужно было бы использовать ссылки на функции или лямбды вместо интерфейсов, и вы должны просто сделать это вместо того, чтобы полагаться на преобразование SAM. Вы можете больше узнать об этом в функциях более высокого порядка и Lambdas . Это выходит за рамки вашего вопроса, чтобы перейти к более подробным сведениям.

Попробуйте с ним:

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