在安卓中无法为下拉框设置OnItemClickListener。

5
在自定义的RecyclerView.Adapter<CustomAdapter.ViewHolder>中,我为一个下拉框设置了适配器,但是发现在选择后下拉框的值没有变化,因此我尝试给下拉框添加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不能与spinner一起使用。这有点奇怪。我的代码有问题吗?还是有人知道为什么我的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>?) {

        }

    }

2
是的,你应该使用 spinner.onItemSelectedListener - Bharatesh
1
请查看此解决方案:https://dev59.com/Mmgu5IYBdhLWcg3wbWo9#11322667 - Hassan Jamil
感谢这些参考资料。很奇怪的是,无论是Java还是Kotlin,在编译时都没有禁用onClick函数。 - whitney13625
嘿,我遇到了类似的问题。但是现在即使我有正确的代码,我的监听器也没有触发。你能确认它对你起作用吗?如果可以的话,也许你可以看一下我的问题,看看是否有任何问题。 这是链接 - Joe Sovcik
@JoeSovcik 对不起,我离开了几个月,直到现在才看到你的评论。看起来你已经找到了问题所在。恭喜! - whitney13625
4个回答

13

参考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中添加"object:"。 - Alex Ioja-Yang

7
请使用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编写的代码。 - whitney13625
哦,我刚找到了一种在Kotlin中编写的方法!太感谢了! - whitney13625
我已经在原问题中添加了它。或许我还应该将其作为一个新答案发布。 - whitney13625

1

在onCreate函数中首先初始化spinner。

 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。

0
你可以创建一个非常简单的扩展函数:
文件: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<*>?) {

    }
})

类似于之前的答案,但更像原始版本,而不是赋值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接