【问题标题】:Kotlin constructor ArrayAdapter not recognizedKotlin 构造函数 ArrayAdapter 无法识别
【发布时间】:2018-02-02 20:48:35
【问题描述】:

我在 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 扩展无关。我的问题是构造函数的理解。

【问题讨论】:

    标签: android kotlin android-arrayadapter


    【解决方案1】:

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

    但是通过使用 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 关键字。我会挖掘找出问题的。

    【讨论】:

    【解决方案2】:

    如果您没有将构造函数参数声明为val 或var,您只能在init 块内访问它们,因为它们不是属性:

    class Test(context: Context) {
    
        private lateinit var applicationContext: Context
    
        init {
            applicationContext = context.applicationContext
        }
    }
    

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

    class Test(val context: Context) {
    
        private lateinit var applicationContext: Context
    
        fun test() {
            applicationContext = context.applicationContext
        }
    }
    

    【讨论】:

      【解决方案3】:
      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<*>) {
      
          }
      }
      

      也许对你有帮助,试试吧。

      【讨论】:

      • 在我的情况下不起作用,我真的需要使用我的适配器,因为我需要传递一个对象,我的 UI 将有一个文本视图和一个自定义颜色。
      • 意味着您正在创建自定义阵列适配器。
      • 是的,完全正确。我需要使用我的自定义数组适配器,现在我只是传递了一个 Pair,但稍后它将是一个对象。
      猜你喜欢
      • 2019-12-29
      • 2015-05-05
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多