FIG-GHD742
FIG-GHD742

Reputation: 2486

Android: Spinner on selected by user

I try to attach a on select event to my Android android.widget.Spinner

I know Spinner.setOnItemSelectedListener exist but not work as I want, The problem with the setOnItemSelectedListener is that method is call while the spinner is load with a Adapter and as predefine a item is select.

I want a interface for get a event while a "user" select a item from the Spinner by use the tuch screen. Also a event that only is call while the use select a item and not the program select a item.

I want a event that is call while the use select a item from this spinner dialog.

enter image description here

Upvotes: 2

Views: 3187

Answers (3)

Fernando Leal
Fernando Leal

Reputation: 10125

As mentioned in this matter the onClick() does not work starting but recent versions of android (I tested it on some versions from 4.0).

So I adapted the answer for this FIG-GHD742 who works in newer versions of android (tested on 4.1 and 4.3):

public class SelectSpinner extends Spinner {

    public interface OnSelectSpinnerListener {

        public void onOpenSelectMenu();

        public void onItemSelectByUser(AdapterView<?> parent, View view,
                int position, long id);
    }

    private boolean isUserOpen = false;

    private List<OnSelectSpinnerListener> onSelectSpinnerListeners;
    private OnItemSelectedListener onItemSelectedListener;

    public SelectSpinner(Context context) {
        super(context);
        registerEvents();
    }

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

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

    /**
     * Register default events
     * */
    private void registerEvents() {
        // overrides the default event for android OnItemSelectedListener
        super.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {
                if (onItemSelectedListener != null) {
                    // call onItemSelected default event in android
                    onItemSelectedListener.onItemSelected(parent, view,
                            position, id);
                }
                // checks if the spinner selection is opened by the user and has event listener
                if (isUserOpen && onSelectSpinnerListeners != null) {
                    for (OnSelectSpinnerListener listener : onSelectSpinnerListeners) {
                        listener.onItemSelectByUser(parent, view, position, id);
                    }
                    isUserOpen = false;
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                if (onItemSelectedListener != null) {
                    // call onNothingSelected default event in android
                    onItemSelectedListener.onNothingSelected(parent);
                }
            }
        });
    }

    public void addOnSelectSpinnerListener(
            OnSelectSpinnerListener onSelectSpinnerListener) {
        if (this.onSelectSpinnerListeners == null) {
            this.onSelectSpinnerListeners = new ArrayList<SelectSpinner.OnSelectSpinnerListener>();
        }
        this.onSelectSpinnerListeners.add(onSelectSpinnerListener);
    }

    @Override
    public void setOnItemSelectedListener(OnItemSelectedListener listener) {
        this.onItemSelectedListener = listener;
    }

    @Override
    public boolean performClick() {
        // isUserOpen variable set to true, to indicate that there was user interaction
        isUserOpen = true;
        if (this.onSelectSpinnerListeners != null) {
            for (OnSelectSpinnerListener listener : this.onSelectSpinnerListeners) {
                // call onOpenSelectMenu event
                listener.onOpenSelectMenu();
            }
        }
        return super.performClick();
    }
}

Upvotes: 4

FIG-GHD742
FIG-GHD742

Reputation: 2486

I have finally find a solution that works for me, by look at the code on http://www.oschina.net/code/explore/android-4.0.1/core/java/android/widget/Spinner.java

I found out how to prevent or attach more code to this code part that is run while the use will show the dropdown list and then create my one instace of Spinner.

My spinner class has a use define interface OnSelectSpinnerListener that will be run while the user tuch the spinner and then select a item from the spinner list.

/**
 * Create a DropDown Spinner/Select List, that also has some event for detect
 * action do by the use and action do by the system.
 *
 * Use {@link OnSelectSpinnerListener} for attach a listener to this
 * SelectSpinner.
 */
public class SelectSpinner extends Spinner {

    public interface OnSelectSpinnerListener {

        /**
         * Call before the drop down menu is show that allow use to select one
         * of the item from the Spinner.
         */
        public void onOpenSelectMenu();

        /**
         * Call while the use press a button or item for select this. This will
         * not be call while the system set a select value for the spinner. Use {@link SelectSpinner#setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener)}
         * for get all event while a item is set to the spinner.
         *
         * @param index Select item as Index
         * @param object Select item as Object
         */
        public void onItemSelectByUser(int index, Object object);
    }
    private OnSelectSpinnerListener onSelectSpinnerListener;

    public SelectSpinner(Context context) {
        super(context);

    }

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

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

    public OnSelectSpinnerListener getOnSelectSpinnerListener() {
        return onSelectSpinnerListener;
    }

    public void setOnSelectSpinnerListener(OnSelectSpinnerListener onSelectSpinnerListener) {
        this.onSelectSpinnerListener = onSelectSpinnerListener;
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        super.onClick(dialog, which);
        if (this.onSelectSpinnerListener != null) {
            Object item = super.getItemAtPosition(which);
            this.onSelectSpinnerListener.onItemSelectByUser(which, item);
        }
    }

    @Override
    public boolean performClick() {
        if (this.onSelectSpinnerListener != null) {
            this.onSelectSpinnerListener.onOpenSelectMenu();
        }
        return super.performClick();
    }
}

Upvotes: 3

Ketan Ahir
Ketan Ahir

Reputation: 6728

spinner.setOnItemSelectedListener(this)
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    //here arg2 will return the number of option which user select

spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            switch (arg2) {
            case 0:

                // do something for london
                Toast.makeText(getApplicationContext(), "London",Toast.LENGTH_SHORT).show();
                break;
            case 1:
                // do something for Paris
                Toast.makeText(getApplicationContext(), "Paris",Toast.LENGTH_SHORT).show();
                break;
            case 2:
                // do something for Stockholm
                Toast.makeText(getApplicationContext(), "Stockholm",Toast.LENGTH_SHORT).show();
                break;

            default:
                break;
            }

        }
}

@Override
public void onNothingSelected(AdapterView<?> arg0) {
    // TODO Auto-generated method stub enter code here
}

Upvotes: 0

Related Questions