【问题标题】:Cannot set OnItemClickListener for spinner in android无法在 android 中为微调器设置 OnItemClickListener
【发布时间】:2016-04-21 06:37:06
【问题描述】:

在一个自定义的RecyclerView.Adapter<CustomAdapter.ViewHolder>中,我为spinner设置了一个适配器,发现我的spinner的值在选择后没有变化,所以我尝试在我的spinner上添加一个OnItemClickListener

override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {

    // The selectable items of the spinner is dynamically generated from getItems() function
    val selectableItems: List<String> = getItems()

    val spinnerAdapter = ArrayAdapter<String>(this.context, androi.R.layout.simple_spinner_item)
    spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    spinnerAdapter.addAll(selectableItems)

    viewHolder.mySpinner.adapter = spinnerAdapter

    // the error occurs on the following line:
    viewHolder.mySpinner.onItemClickListener = AdapterView.OnItemClickListener { adapterView, view, i, l ->
        adapterView.setSelection(i)
    }

    viewHolder.mySpinner.setSelection(origionSelectedPosition)
}

编译时我没有收到任何警告或错误,但是在运行时,我收到了一个 RuntimeException 说 setOnItemClickListener cannot be used with a spinner。这有点奇怪。我的代码做错了吗?或者有谁知道为什么我的微调器没有随着相应的选择而改变?

Kotlin 解决方案的进一步说明:

我曾尝试使用onItemSelectedListener,但未能在 kotlin 中找到合适的使用方式。 但最后!以下代码解决了我的问题:

    viewHolder.mySpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {

        override fun onItemSelected(parent: AdapterView<*>, view: View, pos: Int, id: Long) {

        }

        override fun onNothingSelected(parent: AdapterView<out Adapter>?) {

        }

    }

【问题讨论】:

标签: android android-spinner kotlin


【解决方案1】:

根据 sasikumar 的回答,我在 kotlin 中使用以下代码解决了这个问题:

viewHolder.mySpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {

    override fun onItemSelected(parent: AdapterView<*>, view: View, pos: Int, id: Long) {

    }

    override fun onNothingSelected(parent: AdapterView<out Adapter>?) {

    }

}

【讨论】:

  • 虽然 sasikumar 的回答帮助您实现了目标,但我相信您应该接受自己的回答作为解决方案,并为大家节省未来的时间。我尝试了很多方法,但不知道在 Kotlin 中添加“对象:”
【解决方案2】:

使用setOnItemSelectedListener 代替onItemClickListener

viewHolder.mySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
});

【讨论】:

  • 那也是我一直坚持的地方...实际上我曾尝试使用它,但是由于我是在 kotlin 中编写的,所以我找不到编译器不会抱怨的合适语法...稍后我将在我的问题中附加我在 kotlin 中的代码。
  • 哦,我刚刚找到了一种在 Kotlin 中写入的方法!非常感谢!
  • 我已经在我原来的问题中添加了它。也许我也应该将其作为新答案发布。
【解决方案3】:

首先在 onCreate 函数初始化微调器。

 var spinner : Spinner ?= null

spinner = findViewById(R.id.spinner) as Spinner 

现在使用 Spinner 添加细节。 这里我使用了来自字符串资源的数组。

 fun addSpinnerData(){

   var arr = (resources.getStringArray(R.array.data_list).toMutableList());
    adapter = ArrayAdapter<String>(
            this,
            android.R.layout.simple_list_item_1,
            arr)

    spinner!!.setAdapter(adapter);

    spinner!!.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
        override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
            Toast.makeText(applicationContext," On Click",Toast.LENGTH_SHORT).show();
        }

        override fun onNothingSelected(p0: AdapterView<*>?) {
        }
    }

}

这样就可以实现Spinner的onItemSelectedListener

【讨论】:

    【解决方案4】:

    你可以创建一个非常简单的扩展函数:

    文件:Extensions.kt

    fun Spinner.setOnItemSelectedListener(listener: AdapterView.OnItemSelectedListener) {
        onItemSelectedListener = listener
    }
    

    那你可以随心所欲地调用它

    spinner.setOnItemSelectedListener(object: AdapterView.OnItemSelectedListener {
        override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
    
        }
    
        override fun onNothingSelected(parent: AdapterView<*>?) {
    
        }
    })
    

    与之前的答案类似,但看起来更像原始版本而不是作业

    【讨论】:

      猜你喜欢
      • 2014-03-03
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      相关资源
      最近更新 更多