Kotlin的构造函数ArrayAdapter无法识别

我在Kotlin中扩展ArrayAdapter有一个问题。

这里代码:

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

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

如果你没有声明你的构造函数参数为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 } } 

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

但通过使用val关键字调用您的构造函数,它正在工作。

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

无论如何,我不知道为什么在这种情况下val关键字是必需的。 我会挖掘发现问题。

 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<*>) { } } 

它可以帮助你,尝试一下。