Passing a listener object as a function parameter in kotlin

后端 未结 2 798
死守一世寂寞
死守一世寂寞 2020-12-07 02:34

I\'m trying to pass a listener from an action to a class (an adapter).

In java (code from the Action):

  private void setListeners() {
    adapterRe         


        
相关标签:
2条回答
  • 2020-12-07 03:00

    Change

    adapterRecyclerView!!.setListener  { v  ->
                          SomeCodehere....
    }
    

    to

    adapterRecyclerView!!.setListener(object : View.OnClickListener {
    
    })
    

    and implement the methods of View.OnClickListener

    0 讨论(0)
  • 2020-12-07 03:03

    In the case of calling Java code you are benefitting from SAM conversion for single method interfaces written in Java. Then when you port the interface to Kotlin it does not allow this yet (Kotlin currently assumes you would use function references and lambdas instead of a single method interface).

    The problem is the same as from this other similar question: Android - Kotlin - object must be declared abstract or implement abstract member

    Since this is a Kotin interface, you cannot use the SAM conversion to a Lambda so that is why the other answer previously provided does not work. If this was a Java interface, you could do that. You can track SAM conversions for Kotlin interfaces in KT-7770.

    If you wanted this code to be more idiomatic Kotlin you would want function references or lambdas instead of interfaces, and you should just do that instead of relying on SAM conversion. You can read more about that in Higher-Order Functions and Lambdas. This is outside the scope of your question to go into more detail.

    Therefore as mentioned in another answer by @joakim, you must pass in a instance of a class that implements this interface. This is called an Object Expression and looks like:

    object : View.OnClickListener {
        override fun onClick(v: View) {...}
    })
    

    Or realistically you should change your Kotlin port of the code to accept a reference to a function so that a lambda can be passed in directly. That would be more idiomatic and you would be able to call it as you were originally attempting.

    0 讨论(0)
提交回复
热议问题