2016-04-21 70 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的微調