Androidアプリ開発

Spinnerで同一項目の選択を検知する

この記事は約11分で読めます。
記事内に広告が含まれています。
スポンサーリンク

この記事は Androidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Java での開発経験、XML構文規則、Android のアプリ開発経験がある方を対象としています。
Android のアプリ開発でお役にたててれば、嬉しいです。
(これから Android のアプリ開発や Java での開発を始めたい方への案内は、
記事の最後で紹介します)

この記事のテーマ


ドロップダウンリスト(Spinner)で前回と同じアイテムでも選択を検出する

ポイント

ドロップダウンリスト(Spinner)は前回選択したアイテムと同じアイテムを選択した場合、onItemSelectedのイベントが発生しません。
アイテム選択時に前回と同じアイテムであっても、処理を行いたい場合に問題があります。
回避策として、選択時の処理でアイテム選択をリセットさせる方法が考えられますが、何を選択したかわかなくなるため有効な回避策とはいえません。
今回は、
Spinnerを継承したカスタムクラスを使用した方法を紹介いたします。

前回と同じアイテムでも選択を検出できるカスタムSpinner

ドロップダウンリスト(androidx.appcompat.widget.AppCompatSpinner)を継承したCustomSpinnerを作成します。
カスタムクラスを作成するといっても、前回と同じアイテムを選択した場合でも、
onItemSelected のイベントが発生するようにsetSelectionをオーバライドするだけです。

カスタムクラス(CustomSpinner)

コンストラクタは、継承元のSpinnerと同じものをすべて用意します。
アイテムの選択
setSelectionには、アニメーションの有無で2つあるため、両方のメソッドをオーバーライドします。
前回と同じアイテムを選択した場合にリスナーの
onItemSelectedを呼び出す処理を追加します。

public class CustomSpinner extends androidx.appcompat.widget.AppCompatSpinner {
    public CustomSpinner(Context context) {
        super(context);
    }
    public CustomSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public CustomSpinner(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override public void
    setSelection(int position, boolean animate) {
        boolean similar = position == getSelectedItemPosition();
        super.setSelection(position, animate);
        if (similar) {
            getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
        }
    }

    @Override public void
    setSelection(int position) {
        boolean similar = position == getSelectedItemPosition();
        super.setSelection(position);
        if (similar) {
            getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
        }
    }
}

カスタムクラスの使用方法

カスタムクラスの使用方法は、Spinnerを指定していた部分を、CustomSpinnerに置き換えるだけです。

        :     
        CustomSpinner type = view.findViewById(R.id.type);
        ArrayAdapter<String> adapter = new ArrayAdapter<>(context, R.layout.item_spinner, getResources().getStringArray(R.array.array_type));
        adapter.setDropDownViewResource(R.layout.item_spinner);
        type.setAdapter(adapter);
        type.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                 // 選択時の処理
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // 処理があれば、ここに記述する
            }
        });
        :  

◎レイアウト(fragment.xml)

                :
                <com.xxx.xxxx.CustomSpinner
                    android:id="@+id/type"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:entries="@array/array_type" />
                :

◎レイアウト(item_spinner.xml)

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/name"
    android:layout_width="match_parent"
    android:layout_height="30dp"
    android:textSize="14sp"
    android:textColor="@color/white"
    style="?android:attr/spinnerDropDownItemStyle"/>

◎strings.xml

    :
    <string-array name="array_type">
        <item>×1</item>
        <item tools:ignore="TypographyFractions">×1/2</item>
        <item tools:ignore="TypographyFractions">×1/4</item>
        <item>×1/8</item>
    </string-array>
    :

今回は、ここまでです。

同一項目の選択を検知するCustomSpinnerを使用しているAndroidアプリです。
チャプタや再生速度を選択するドロップダウンリストで使用しています。

スマホスタンドはアプリ開発の必需品と言って良いでしょう♪

誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にある
コメントか、
こちらから、お願いいたします♪

ポチッとして頂けると、
次のコンテンツを作成する励みになります♪

ブログランキング・にほんブログ村へ

これからAndroidのアプリ開発やJavaでの開発を始めたい方へ

アプリケーション開発経験がない方や、アプリケーション開発経験がある方でも、Java や C# などのオブジェクト指向言語が初めての方は、Android のアプリ開発ができるようになるには、かなりの時間がかかります。
オンラインスクールでの習得を、強くおススメします。

未経験者からシステムエンジニアを目指すのに最適です。まずは無料相談から♪

未経験者からプログラマーを目指すのに最適です。まずは無料カウンセリングから♪

カリキュラムとサポートがしっかりしています。お得なキャンペーンとかいろいろやっています♪

ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適です。まずは無料オンライン相談から♪

参考になったら、💛をポッとしてね♪