2016-04-21 10 views
5

W dostosowanych RecyclerView.Adapter<CustomAdapter.ViewHolder>, ustawić adapter do wirówki i stwierdzono, że wartość mojej turbinki nie zmieni się po wyborze, więc starałem się dodać OnItemClickListener na mojej turbinki:Nie można ustawić OnItemClickListener do wirówki w 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) 
} 

Podczas kompilacji nie otrzymałem żadnego ostrzeżenia lub błędu, jednak w czasie wykonywania otrzymałem wyjątek RuntimeException, który mówi, że setOnItemClickListener cannot be used with a spinner. To trochę dziwne. Czy zrobiłem coś złego w moim kodzie? Czy ktoś może wiedzieć, dlaczego mój spinner nie zmienił się z odpowiednim wyborem?

Dalszy opis do sporządzania roztworu Kotlin:

kiedykolwiek próbował użyć onItemSelectedListener ale nie udało się znaleźć odpowiedni sposób na wykorzystanie go w Kotlin. Ale w końcu! Poniższy kod rozwiązać mój problem:

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

tak .. jesteś przypuszczać, aby użyć 'spinner.onItemSelectedListener' – Bharatesh

+2

Możliwa duplikat [mam błąd: setOnItemClickListener nie może być używany z wirówki, co jest nie tak?] (http://stackoverflow.com/questions/11322642/i-have-an-error-setonitemclicklistener-cannot-be-used-with-a-spinner-what-is-w) – miensol

+1

Sprawdź to rozwiązanie : http://stackoverflow.com/a/11322667/3819836 –

Odpowiedz

3

Korzystając setOnItemSelectedListener zamiast 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

Tam też utknąłem ...Właściwie to próbowałem go użyć, jednak odkąd napisałem w Kotlin, nie udało mi się znaleźć odpowiedniej składni, której kompilator nie narzeka ... Dodam mój kod do kotlin na ten temat w późniejszym pytaniu. – whitney13625

+0

Och, właśnie znalazłem sposób na napisanie w Kotlin! wielkie dzięki! – whitney13625

+0

Dodałem już to w moim oryginalnym pytaniu. Może powinienem również opublikować to jako nową odpowiedź. – whitney13625

9

następującą odpowiedź sasikumar, w Rozwiązałem go w Kotlin z następującego kodu:

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

Mimo że odpowiedź sasikumara pomogła ci się tam dostać, jestem pewien, że powinieneś zaakceptować własną odpowiedź jako rozwiązanie i zaoszczędzić każdemu czasu w przyszłości. Próbowałem na tak wiele sposobów, ale nie wiedziałem o dodaniu "obiektu:" w Kotlin –

0

można stworzyć bardzo prostą funkcję rozszerzenia:

file: Extensions.kt

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

Następnie możesz nazwać to tak, jak chcesz

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

    } 

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

    } 
}) 

podobne do poprzednich odpowiedzi, ale wygląda bardziej jak w oryginalnej wersji zamiast cesji

1

zainicjalizuję tarczy w funkcji onCreate.

var spinner : Spinner ?= null 

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

Teraz dodaj szczegóły z Spinner. Tutaj użyłem tablicy z zasobu ciągów.

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

} 

W ten sposób można osiągnąć onItemSelectedListener dla Spinner

Powiązane problemy