Android 访问Kotlin中匿名实现接口外部的变量(使用对象)

Android 访问Kotlin中匿名实现接口外部的变量(使用对象),android,object,kotlin,Android,Object,Kotlin,我把我的生活搞糊涂了。简而言之,我无法在匿名Kotlin对象之外访问上下文 首先,我得到了这个简单的基本回收器视图适配器。 class CashAdapter(private val cashList: List<Cash>, private val clickedAction: ClickedListener) : RecyclerView.Adapter<CashViewHolder>() { interface ClickedListener {

我把我的生活搞糊涂了。简而言之,我无法在匿名Kotlin
对象之外访问上下文

首先,我得到了这个简单的基本回收器视图适配器。

class CashAdapter(private val cashList: List<Cash>, private val clickedAction: ClickedListener) : RecyclerView.Adapter<CashViewHolder>() {

    interface ClickedListener {
        fun onItemClick(cash: Cash)
    }

    // the rest of plain basic recycler view adapter stuff
}
证明我确实尝试过某件事

class MainActivity : AppCompatActivity() {
    internal val context: Context = this
    private val cashList: MutableList<Cash> = ArrayList()
    private lateinit var recyclerView: RecyclerView
    private lateinit var mAdapter: CashAdapter
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding =
            DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        recyclerView = binding.rvMovies
        mAdapter = CashAdapter(cashList, action)
        val mLayoutManager: RecyclerView.LayoutManager = LinearLayoutManager(applicationContext)
        recyclerView.setLayoutManager(mLayoutManager)
        recyclerView.setItemAnimator(DefaultItemAnimator())
        recyclerView.setAdapter(mAdapter)
        prepareMovieData()
    }

    private fun goToNextActivity() {
        val intent = Intent(context, NewActivity::class.java)
        this.startActivityForResult(intent, NEW_ACTIVITY_REQUEST_CODE, null)
    }

    object action: CashAdapter.ClickedListener{
        override fun onItemClick(cash: Cash) {
            goToNextActivity() // <-- CANNOT FIND THIS METHOD
        }
    }
}
是的,这很有效。

class CashAdapter(private val cashList: List<Cash>, private val clickedAction: ClickedListener) : RecyclerView.Adapter<CashViewHolder>() {

    interface ClickedListener {
        fun onItemClick(cash: Cash)
    }

    // the rest of plain basic recycler view adapter stuff
}

但我想知道的是匿名实现的情况。确切的解决办法是什么?感谢阅读

当您在kotlin中的匿名类上使用此选项时,您指的是您正在实现的实际类,在本例中为CashAdapter:

class MainActivity : AppCompatActivity() {
    internal val context: Context = this
    private val cashList: MutableList<Cash> = ArrayList()
    private lateinit var recyclerView: RecyclerView
    private lateinit var mAdapter: CashAdapter
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding =
            DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        recyclerView = binding.rvMovies
        mAdapter = CashAdapter(cashList, action)
        val mLayoutManager: RecyclerView.LayoutManager = LinearLayoutManager(applicationContext)
        recyclerView.setLayoutManager(mLayoutManager)
        recyclerView.setItemAnimator(DefaultItemAnimator())
        recyclerView.setAdapter(mAdapter)
        prepareMovieData()
    }

    private fun goToNextActivity() {
        val intent = Intent(context, NewActivity::class.java)
        this.startActivityForResult(intent, NEW_ACTIVITY_REQUEST_CODE, null)
    }

    object action: CashAdapter.ClickedListener{
        override fun onItemClick(cash: Cash) {
            goToNextActivity() // <-- CANNOT FIND THIS METHOD
        }
    }
}
this.startActivityForResult(intent, NEW_ACTIVITY_REQUEST_CODE, null)
只需使用以下命令告诉kotlin,该子句指的是MainActivity,而不是您的匿名CashAdapter对象:

this@MainActivity.startActivityForResult(intent, NEW_ACTIVITY_REQUEST_CODE, null)

当您在kotlin中的匿名类上使用此选项时,您指的是您正在实现的实际类,在本例中为CashAdapter:

this.startActivityForResult(intent, NEW_ACTIVITY_REQUEST_CODE, null)
只需使用以下命令告诉kotlin,该子句指的是MainActivity,而不是您的匿名CashAdapter对象:

this@MainActivity.startActivityForResult(intent, NEW_ACTIVITY_REQUEST_CODE, null)

如果你改变这一切都会好的

private val action = object: CashAdapter.ClickedListener{
    override fun onItemClick(cash: Cash) {
        goToNextActivity()
    }
}

对象操作:CashAdapter.ClickedListener
类似于
静态CashAdapter.ClickedListener操作
。因此,当您在静态方法中调用goToNextActivity()时,它在MainActivity实例上没有引用。

如果您对此进行更改,一切都将正常

private val action = object: CashAdapter.ClickedListener{
    override fun onItemClick(cash: Cash) {
        goToNextActivity()
    }
}

对象操作:CashAdapter.ClickedListener
类似于
静态CashAdapter.ClickedListener操作
。因此,当您在静态方法中调用goToNextActivity()时,它没有对MainActivity实例的引用。

private val action:CashAdapter.ClickedListener=CashAdapter.ClickedListener{override fun onItemClick(cash:cash){…}这是正确的解决方案还是我应该更改某些内容?是的,请。请注意,如果没有
object
关键字,这是一个语法错误,因为它不是类而是接口,kotlin中的接口实现需要
object:InterfaceName{…}
private val action:CashAdapter.ClickedListener=CashAdapter.ClickedListener{mclick(cash:cash){…}这是正确的解决方案还是我应该更改一些内容?是的。请注意,如果没有
object
关键字,这是一个语法错误,因为它不是类而是接口,kotlin中的接口实现需要
object:InterfaceName{…}