Kotlin – 期待会员声明

我试图将我的应用程序从Java转换到Kotlin。

我使用了Android Studio Built-in转换器,并修复了大部分生成的错误。

对Kotlin来说,这是一个非常辛苦的时刻:

我得到了这个类是用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是Kotlin的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引起的,即使它没有任何sintax错误

既然你已经把这两个文件转换成了Kotlin,而且OnItemClickListener接口是用Kotlin编写的,你不能像这样传递一个函数lambda。 最好的方法是创建一个匿名的接口实例(你也可以使用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) ... } }) 

或者,您可以使用ItemClickSupport HighOrder函数来仅接收lambda并避免接口。