Невозможно установить OnItemClickListener для spinner в android

В настроенном 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 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>?) { } } 

Используйте 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) { } }); 

Следуя ответу сасикумара, я решил его в котлин со следующим кодом:

 viewHolder.mySpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>, view: View, pos: Int, id: Long) { } override fun onNothingSelected(parent: AdapterView<out Adapter>?) { } } 

Сначала инициализируйте spinner в функции 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 для Spinner

Вы можете создать очень простую функцию расширения:

файл: 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<*>?) { } }) 

Подобно предыдущим ответам, но он больше похож на исходную версию вместо назначения