2016-04-21 67 views
5

飞旋在定制RecyclerView.Adapter<CustomAdapter.ViewHolder>,我设置的适配器的微调,发现我的飞旋的价值选择之后没有改变,所以我想在我的微调添加OnItemClickListener无法设置OnItemClickListener请在Android

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。这有点奇怪。我在代码中做错了什么?还是有人知道为什么我的微调没有改变相应的选择?

的科特林解决方案的进一步说明:

我曾经试图用onItemSelectedListener但未能找到在科特林使用它一个合适的方式。 但终于!下面的代码解决了我的问题:

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

+2

可能的复制[我有一个错误:setOnItemClickListener不能使用旋转器一起使用,什么是错误?](http://stackoverflow.com/questions/11322642/i-have-an-error-setonitemclicklistener-cannot-be-used-with-a-spinner-what-is-w) – miensol

+1

检查此解决方案:http://stackoverflow.com/a/11322667/3819836 –

回答

3

使用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) { 

    } 
}); 
+0

这就是我所在的地方......其实我试图使用这个,但是因为我写在kotlin中,我没有找到编译器不会抱怨的适当语法......我将在后面的问题中将我的代码添加到kotlin中。 – whitney13625

+0

哦,我刚刚找到一种方式在Kotlin写信!非常感谢! – whitney13625

+0

我已将它添加到原始问题中。也许我也应该把它作为一个新的答案。 – whitney13625

9

继sasikumar的回答,我解决它在科特林用下面的代码:

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

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

    } 

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

    } 

} 
+0

尽管sasikumar的答案帮助你达到了目标,但我相信你应该接受你自己的答案作为解决方案,并为将来每个人节省时间。我尝试了很多方法,但不知道在Kotlin中添加“对象:” –

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

    } 
}) 

到以前的答案相似,但它看起来更像原来的版本,而不是分配

1

首先,在功能的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<*>?) { 
     } 
    } 

} 

通过这种方式可以实现onItemSelectedListener的微调