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