No se puede establecer OnItemClickListener for spinner en Android

En un RecyclerView.Adapter<CustomAdapter.ViewHolder> personalizado RecyclerView.Adapter<CustomAdapter.ViewHolder> , configuré un adaptador para un spinner y descubrí que el valor de mi spinner no cambia después de la selección, así que traté de agregar un OnItemClickListener en mi spinner:

 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) } 

No recibí ninguna advertencia o error durante la compilation, sin embargo, durante el time de ejecución, recibí una RuntimeException que decía que setOnItemClickListener cannot be used with a spinner . Es un poco extraño ¿Hice algo mal en mi código? ¿O alguien sabe por qué mi spinner no cambió con la selección correspondiente?

Descripción adicional de la solución de Kotlin:

Alguna vez traté de usar onItemSelectedListener pero no onItemSelectedListener encontrar una forma adecuada de usarlo en kotlin. ¡Pero finalmente! El siguiente código resolvió mi problema:

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

Use setOnItemSelectedListener lugar de 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) { } }); 

Siguiendo la respuesta de sasikumar, lo resolví en kotlin con el siguiente código:

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

Primero inicializa el spinner en la function onCreate.

  var spinner : Spinner ?= null spinner = findViewById(R.id.spinner) as Spinner 

Ahora agrega detalles con Spinner. Aquí he usado array desde el recurso de cadena.

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

De esta forma puedes lograr onItemSelectedListener para Spinner

Puede crear una function de extensión muy simple:

file: Extensions.kt

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

Entonces puedes llamarlo de la manera que quieras

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

Similar a las respuestas anteriores, pero se parece más a la versión original en lugar de la tarea

  • Error de traducción no detectada: com.android.dx.cf.code.SimException: local 0007: no válido
  • Kotlin: ¿cómo usar múltiples generics en class?
  • Genéricos reificados en Scala 2.10
  • Kotlin no puede identificar los parameters a less que se haga reference explícita
  • Repetir una textura en una región de textura
  • ¿Cuál es el nombre correcto para la documentation en línea de Kotlin?
  • solo se permiten classs en el lado izquierdo de un literal de class al usar Mockito y kotlin
  • ¿Cómo leer un file de text de resources en Kotlin?
  • ¿Es posible anular Java getter (método) con Kotlin val (propiedad)?
  • Mockito never () no funciona con andThen rxjava2
  • Kotlin lambdas sin usar objects