当前位置: 首页 > 知识库问答 >
问题:

Kotlin-需要成员声明[重复]

山乐生
2023-03-14

我试图将我的应用程序从Java转换为静态编程语言

我使用了Android Studio内置转换器并修复了它生成的大部分错误。

对于科特林来说,这一次让我很难受:

我得到了这个用Java编写的类,并进行了转换,显然没有任何错误,这有助于我在回收视图中管理项目点击:

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

在main活动中,转换后在onCreate函数中设置如下:

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

            ...
        }

IDE给我以下错误:

类型不匹配:

必需:ItemClickSupport。OnItemClickListener

发现:(???,???,???)-

现在,我知道单位是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)
        })

现在我得到了

预期的成员声明

正如在另一个答案中所述,它与构造函数有关。

这是项ClickSupport吗。OnItemClickListener构造函数?如果是,我应该改变什么?

我怀疑错误仍然是由OnClickSupport类被错误地转换为kotlin引起的,即使它没有任何sintax错误

共有1个答案

宋高寒
2023-03-14

由于您已将这两个文件转换为静态编程语言,并且OnItemClickListener接口是用静态编程语言编写的,因此您不能传递这样的函数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 Function来仅接收lambda并避免接口。

 类似资料:
  • 此代码将显示错误“android java访问来自内部类,需要声明为final” 如果您将变量设置为最终变量,或将变量设置为类字段,则错误将消失。 类字段和final关键字有什么不同?

  • 加或者不加的影响是什么?

  • 本文向大家介绍Prolog操作员声明,包括了Prolog操作员声明的使用技巧和注意事项,需要的朋友参考一下 示例 在Prolog中,可以使用op/3以下命令定义自定义运算符: op(+Precedence, +Type, :Operator) 声明运算符为具有优先级的类型的运算符。运算符也可以是名称列表,在这种情况下,列表的所有元素都声明为相同的运算符。 优先级是介于0和1200之间的整数,其中0

  • Stroustrup C++第4版第796页指出 “如果的条件计算为,则完全忽略它所在的整个函数声明。”和“...我们不申报任何东西。”。 我也读过这个建议的线程,在这个线程中,SFINAE只有在模板参数的参数推导中的替换使构造格式不正确时才起作用。

  • 问题内容: 为什么编译器没有在开关中的每个代码块之后自动放置break语句?是出于历史原因吗?您何时要执行多个代码块? 问题答案: 有时将多个案例与同一代码块关联会很有帮助,例如 等。只是一个例子。 以我的经验,通常“摔倒”并在一种情况下执行多个代码块是不好的风格,但是在某些情况下可能会有用处。

  • 我有一个网站,点击量很大。我遇到过一些问题,包括JDBC连接错误。 我对结束PreparedStatement有点困惑。我需要关闭PreparedStatement吗?还是只需要关闭语句就足够了? 另外,呢?我也需要关闭它吗?