更改 Spinner 的 getAdapter() 和 setAdapter() 方法
Change Spinner's getAdapter() and setAdapter() method
这个问题看起来很明显,但我想不通。
我有一个自定义的 LanguageSpinner class:
class LanguageSpinner(context: Context, attrs: AttributeSet) : AppCompatSpinner(context, attrs) {
override fun getSelectedItem(): LanguageSpinnerItem {
return super.getSelectedItem() as LanguageSpinnerItem
}
fun getSelectedLanguage() : Language {
return selectedItem.language
}
override fun setAdapter(languageSpinnerAdapter: LanguageSpinnerAdapter) {
this.adapter = languageSpinnerAdapter // ?
}
override fun getAdapter(): LanguageSpinnerAdapter {
return super.getAdapter() // ?
}
}
我需要确保 getSelectedItem()
方法将 return 语言 class 对象。所以我的适配器必须是 LanguageSpinnerAdapter
的一个实例。如何为适配器覆盖 getter 和 setter 以接收此确切自定义适配器的实例?至于现在,它说 setter 什么都不覆盖。我明白,这是因为 LanguageSpinnerAdapter 不是 SpinnerAdapter,但我已经在我的自定义适配器中实现了它。那我该怎么办?
我的自定义适配器 class:
class LanguageSpinnerAdapter(
context: Context, private val languageItems : ArrayList<LanguageSpinnerItem>
) : ArrayAdapter<LanguageSpinnerItem>(context, R.layout.spinner_item, languageItems),
SpinnerAdapter {
...
}
这有帮助吗?
class LanguageSpinner(context: Context, attrs: AttributeSet) : AppCompatSpinner(context, attrs) {
override fun setAdapter(languageSpinnerAdapter: SpinnerAdapter) {
super.setAdapter((languageSpinnerAdapter as? LanguageSpinnerAdapter) ?: return)
}
override fun getAdapter(): SpinnerAdapter? {
return super.getAdapter() as? LanguageSpinnerAdapter
}
}
我更喜欢这种实现空安全的方式,但也有人使用 let
(languageSpinnerAdapter as? LanguageSpinnerAdapter)?.let {
super.setAdapter(it)
}
顺便说一下,你必须使用 SpinningAdapter 否则你将无法匹配基本方法。这会导致 'method overrides nothing' 错误。
这个问题看起来很明显,但我想不通。 我有一个自定义的 LanguageSpinner class:
class LanguageSpinner(context: Context, attrs: AttributeSet) : AppCompatSpinner(context, attrs) {
override fun getSelectedItem(): LanguageSpinnerItem {
return super.getSelectedItem() as LanguageSpinnerItem
}
fun getSelectedLanguage() : Language {
return selectedItem.language
}
override fun setAdapter(languageSpinnerAdapter: LanguageSpinnerAdapter) {
this.adapter = languageSpinnerAdapter // ?
}
override fun getAdapter(): LanguageSpinnerAdapter {
return super.getAdapter() // ?
}
}
我需要确保 getSelectedItem()
方法将 return 语言 class 对象。所以我的适配器必须是 LanguageSpinnerAdapter
的一个实例。如何为适配器覆盖 getter 和 setter 以接收此确切自定义适配器的实例?至于现在,它说 setter 什么都不覆盖。我明白,这是因为 LanguageSpinnerAdapter 不是 SpinnerAdapter,但我已经在我的自定义适配器中实现了它。那我该怎么办?
我的自定义适配器 class:
class LanguageSpinnerAdapter(
context: Context, private val languageItems : ArrayList<LanguageSpinnerItem>
) : ArrayAdapter<LanguageSpinnerItem>(context, R.layout.spinner_item, languageItems),
SpinnerAdapter {
...
}
这有帮助吗?
class LanguageSpinner(context: Context, attrs: AttributeSet) : AppCompatSpinner(context, attrs) {
override fun setAdapter(languageSpinnerAdapter: SpinnerAdapter) {
super.setAdapter((languageSpinnerAdapter as? LanguageSpinnerAdapter) ?: return)
}
override fun getAdapter(): SpinnerAdapter? {
return super.getAdapter() as? LanguageSpinnerAdapter
}
}
我更喜欢这种实现空安全的方式,但也有人使用 let
(languageSpinnerAdapter as? LanguageSpinnerAdapter)?.let {
super.setAdapter(it)
}
顺便说一下,你必须使用 SpinningAdapter 否则你将无法匹配基本方法。这会导致 'method overrides nothing' 错误。