无法识别 Kotlin 构造函数 ArrayAdapter

Kotlin constructor ArrayAdapter not recognized

我在 Kotlin 中扩展 ArrayAdapter 时遇到问题。

这里是代码:

class SpinnerArrayAdapter(context: Context?, resource: Int, list: ArrayList<Pair<Long, String>>) : ArrayAdapter<Pair<Long, String>>(context, resource, list) {
    override fun getCount(): Int {
        return list.size //error list is unresolved
    }
}

编辑 与 ArrayAdapter 扩展无关。我的问题是构造函数的理解。

class MainActivity : AppCompatActivity(),AdapterView.OnItemSelectedListener {

    var languages = arrayOf("English", "French", "Spanish", "Hindi", "Russian", "Telugu", "Chinese", "German", "Portuguese", "Arabic", "Dutch", "Urdu", "Italian", "Tamil", "Persian", "Turkish", "Other")

    var spinner:Spinner? = null
    var textView_msg:TextView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        textView_msg = this.msg

        spinner = this.spinner_sample
        spinner!!.setOnItemSelectedListener(this)

        // Create an ArrayAdapter using a simple spinner layout and languages array
        val aa = ArrayAdapter(this, android.R.layout.simple_spinner_item, languages)
        // Set layout to use when the list of choices appear
        aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        // Set Adapter to Spinner
        spinner!!.setAdapter(aa)

    }

    override fun onItemSelected(arg0: AdapterView<*>, arg1: View, position: Int, id: Long) {
        textView_msg!!.text = "Selected : "+languages[position]
    }

    override fun onNothingSelected(arg0: AdapterView<*>) {

    }
}

可能对你有帮助,试试吧

我试过你的问题,我发现了同样的问题。

但是通过使用 val 关键字调用构造函数,它可以正常工作。

class SpinnerArrayAdapter(context: Context?, val resource: Int, val list: ArrayList<Pair<Long, String>>) : ArrayAdapter<Pair<Long, String>>(context, resource, list) {
    override fun getCount(): Int {
        return list.size
    }
}

无论如何,我不知道为什么在这种情况下需要 val 关键字。我会深入挖掘问题所在。

如果您不将构造函数参数声明为 valvar,您只能在 init 块中访问它们,因为它们不是属性:

class Test(context: Context) {

    private lateinit var applicationContext: Context

    init {
        applicationContext = context.applicationContext
    }
}

如果您需要在 init 块之外访问它们,您应该根据需要使用 valvar 将它们标记为属性:

class Test(val context: Context) {

    private lateinit var applicationContext: Context

    fun test() {
        applicationContext = context.applicationContext
    }
}