2016-04-21 24 views
5

in modo personalizzato RecyclerView.Adapter<CustomAdapter.ViewHolder>, ho impostato un adattatore per un filatore e ha scoperto che il valore della mia filatore non è il cambiamento dopo la selezione, così ho cercato di aggiungere un OnItemClickListener sul mio filatore:Impossibile impostare OnItemClickListener per filatore in 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) 
} 

Non ho ricevuto alcun avviso o errore durante la compilazione, tuttavia durante il periodo di esecuzione, ho ricevuto una RuntimeException che diceva che setOnItemClickListener cannot be used with a spinner. È un po 'strano. Ho fatto qualcosa di sbagliato nel mio codice? O qualcuno sa perché il mio spinner non è cambiato con la selezione corrispondente?

Ulteriore descrizione per soluzione Kotlin:

avevo mai provato a utilizzare onItemSelectedListener ma non è riuscito a trovare un modo adatto da utilizzare in Kotlin. Ma finalmente! Il seguente codice risolto il mio 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>?) { 

     } 

    } 
+2

sì .. si supponga di usare 'spinner.onItemSelectedListener' – Bharatesh

+2

Eventuali duplicati di [ho un errore: setOnItemClickListener non può essere utilizzato con un filatore, cosa c'è che non va?] (http://stackoverflow.com/questions/11322642/i-have-an-error-setonitemclicklistener-cannot-be-used-with-a-spinner-what-is-w) – miensol

+1

Controlla questa soluzione : http://stackoverflow.com/a/11322667/3819836 –

risposta

3

Uso setOnItemSelectedListener invece di 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

Ecco dove mi sono anche bloccato in ...In realtà avevo provato ad usarlo, comunque da quando ho scritto in kotlin, non riesco a trovare una sintassi appropriata che il compilatore non si lamenti ... Aggiungerò il mio codice in kotlin per questo nella mia domanda successiva. – whitney13625

+0

Oh, ho appena trovato un modo per scrivere in Kotlin! molte grazie! – whitney13625

+0

L'ho già aggiunto alla mia domanda originale. Forse dovrei postarlo anche come una nuova risposta. – whitney13625

9

seguito la risposta di Sasikumar, ho risolto in Kotlin con il seguente codice:

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

Sebbene la risposta di sasikumar ti abbia aiutato ad arrivarci, sono sicuro che dovresti accettare la tua risposta come soluzione e salvare tutti in futuro. Ho provato tanti modi ma non sapevo di aggiungere "object:" in Kotlin –

0

è possibile creare una semplice funzione di estensione:

di file: Extensions.kt

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

Quindi puoi chiamarlo come vuoi

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

    } 

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

    } 
}) 

Simile a risposte precedenti, ma sembra più simile alla versione originale invece che l'assegnazione

1

Prima inizializzare filatore in funzione onCreate.

var spinner : Spinner ?= null 

spinner = findViewById(R.id.spinner) as Spinner 

Ora aggiungere dettagli con Spinner. Qui ho usato l'array dalla risorsa stringa.

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

} 

In questo modo è possibile ottenere onItemSelectedListener per Spinner