やりたいこと
AndroidのSpinnerには、同一項目が選択されたタイミングを知る術がなく必須の項目なのに仕方なく未選択という項目を入れることになってしまう場合等があるかと思います。
解決策
最も手っ取り早く簡単に解決する方法がカスタムのSpinnerクラスを作成することです
CustomPtogramSpinner.kt
class CustomProgramSpinner @JvmOverloads constructor(context: Context?,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0)
: AppCompatSpinner(context, attrs, defStyleAttr) {
override fun setSelection(position: Int, animate: Boolean) {
val sameSelected = position == selectedItemPosition
super.setSelection(position, animate)
// 同じ要素が選択されてもonItemSelectedが呼ばれる様に調整
if (sameSelected) {
onItemSelectedListener?.onItemSelected(this, selectedView, position, selectedItemId)
}
}
override fun setSelection(position: Int) {
val sameSelected = position == selectedItemPosition
super.setSelection(position)
// 同じ要素が選択されてもonItemSelectedが呼ばれる様に調整
if (sameSelected) {
onItemSelectedListener?.onItemSelected(this, selectedView, position, selectedItemId)
}
}
}
本来、AndroidのSpinnerは同一項目が選択された場合はonNothingSelected
のみが呼ばれてしまい、同一項目を選択したタイミングのみに走るものが存在しません。
なので何か項目が選択されたタイミングで、直前に選択されていたものと選択されたもののpositionを見て手動でonItemSelected
を呼ぶことにより、同一項目が選択された場合でも同じ挙動をさせることができます。
最後に
以上が、同一項目選択時を簡単に検知する方法です。
もし他にもっといいやり方があった場合、コメントでぜひ教えてください