更改 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' 错误。