LoginSignup
2
0

More than 1 year has passed since last update.

Spinnerで同一項目が選択されたことを検知したい same position tapped of spinner

Last updated at Posted at 2021-12-22

やりたいこと

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を呼ぶことにより、同一項目が選択された場合でも同じ挙動をさせることができます。

最後に

以上が、同一項目選択時を簡単に検知する方法です。
もし他にもっといいやり方があった場合、コメントでぜひ教えてください

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0