現在選択されている項目が再度選択されたときに Android Spinner でイベントを取得するにはどうすればよいですか? 質問する

現在選択されている項目が再度選択されたときに Android Spinner でイベントを取得するにはどうすればよいですか? 質問する

スピナー項目が変更されたときにスピナーが応答するように、setOnItemSelectedListener を作成しました。現在選択されている項目をもう一度クリックすると、トーストが表示されるようにする必要があります。このイベントを取得するにはどうすればよいでしょうか。現在選択されている項目をもう一度クリックしても、スピナーは応答しません。`

    StorageSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){

        @Override
        public void onItemSelected(AdapterView adapter, View v, int i, long lng) {              
            Toast.makeText(getApplicationContext(), (CharSequence) StorageSpinner.getSelectedItem(), Toast.LENGTH_SHORT).show();

        }

        @Override
        public void onNothingSelected(AdapterView arg0) {
            Toast.makeText(getApplicationContext(), "Nothing selected", Toast.LENGTH_SHORT).show();

        }
    });  

ベストアンサー1

この問題を解決する方法を見つけるのに数時間を費やしました。最終的に次の方法にたどり着きました。すべての場合に機能するかどうかはわかりませんが、私の場合は機能しているようです。これは、選択をチェックし、選択が同じ値に設定されている場合にリスナーを呼び出す Spinner クラスの単なる拡張です。

import android.content.Context;
import android.util.AttributeSet;
import android.widget.Spinner;


/** Spinner extension that calls onItemSelected even when the selection is the same as its previous value */
public class NDSpinner extends Spinner {

    public NDSpinner(Context context)
    { super(context); }

    public NDSpinner(Context context, AttributeSet attrs)
    { super(context, attrs); }

    public NDSpinner(Context context, AttributeSet attrs, int defStyle)
    { super(context, attrs, defStyle); }

    @Override 
    public void setSelection(int position, boolean animate) {
        boolean sameSelected = position == getSelectedItemPosition();
        super.setSelection(position, animate);
        if (sameSelected) {
            // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
            getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
        }
    } 

    @Override
    public void setSelection(int position) {
        boolean sameSelected = position == getSelectedItemPosition();
        super.setSelection(position);
        if (sameSelected) {
            // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
            getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
        }
    }

}

おすすめ記事