// Path: adapter-toolbox/src/main/java/net/cattaka/android/adaptertoolbox/utils/SpinnerUtils.java
// public class SpinnerUtils {
//     public static boolean selectSpinnerValue(@NonNull Spinner spinner, Object value) {
//         return selectSpinnerValue(spinner, value, false);
//     }
// 
//     public static boolean selectSpinnerValue(@NonNull Spinner spinner, Object value, boolean cancelListener) {
//         if (value == null) {
//             for (int i = 0; i < spinner.getCount(); i++) {
//                 if (spinner.getItemAtPosition(i) == null) {
//                     setSelection(spinner, i, cancelListener);
//                     return true;
//                 }
//             }
//             return false;
//         }
//         for (int i = 0; i < spinner.getCount(); i++) {
//             if (value.equals(spinner.getItemAtPosition(i))) {
//                 setSelection(spinner, i, cancelListener);
//                 return true;
//             }
//         }
//         return false;
//     }
// 
//     public static void setSelection(@NonNull Spinner spinner, int position, boolean cancelListener) {
//         if (cancelListener) {
//             AdapterView.OnItemSelectedListener listener = spinner.getOnItemSelectedListener();
//             if (listener != null) {
//                 spinner.setOnItemSelectedListener(null);
//             }
//             spinner.setSelection(position, false);
//             if (listener != null) {
//                 spinner.setOnItemSelectedListener(listener);
//             }
//         } else {
//             spinner.setSelection(position);
//         }
//     }
// 
//     public static void dismissPopup(@NonNull Spinner spinner) {
//         // Does not come to mind is a good way to other...
//         Class<?> clazz = spinner.getClass();
//         Object popup = null;
//         while (popup == null && clazz != null) {
//             try {
//                 Field field = clazz.getDeclaredField("mPopup");
//                 field.setAccessible(true);
//                 popup = field.get(spinner);
//                 if (popup != null) {
//                     popup.getClass().getMethod("dismiss").invoke(popup);
//                     return;
//                 }
//             } catch (Exception e) {
//                 // ignore
//             }
//             clazz = clazz.getSuperclass();
//         }
//     }
// }


import android.content.Context;
import android.content.res.Resources;
import android.support.v7.widget.AppCompatSpinner;
import android.util.AttributeSet;
import net.cattaka.android.adaptertoolbox.utils.SpinnerUtils;
package net.cattaka.android.adaptertoolbox.example.view;



/**
 * Created by takao on 2016/06/11.
 */
public class SpinnerEx extends AppCompatSpinner {
    public SpinnerEx(Context context) {
        super(context);
    }

    public SpinnerEx(Context context, int mode) {
        super(context, mode);
    }

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

    public SpinnerEx(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public SpinnerEx(Context context, AttributeSet attrs, int defStyleAttr, int mode) {
        super(context, attrs, defStyleAttr, mode);
    }

    public SpinnerEx(Context context, AttributeSet attrs, int defStyleAttr, int mode, Resources.Theme popupTheme) {
        super(context, attrs, defStyleAttr, mode, popupTheme);
    }

    public Object getSelectedItem() {
        return getItemAtPosition(getSelectedItemPosition());
    }

    public void setSelectedItem(Object value) {
// Path: adapter-toolbox/src/main/java/net/cattaka/android/adaptertoolbox/utils/SpinnerUtils.java
// public class SpinnerUtils {
//     public static boolean selectSpinnerValue(@NonNull Spinner spinner, Object value) {
//         return selectSpinnerValue(spinner, value, false);
//     }
// 
//     public static boolean selectSpinnerValue(@NonNull Spinner spinner, Object value, boolean cancelListener) {
//         if (value == null) {
//             for (int i = 0; i < spinner.getCount(); i++) {
//                 if (spinner.getItemAtPosition(i) == null) {
//                     setSelection(spinner, i, cancelListener);
//                     return true;
//                 }
//             }
//             return false;
//         }
//         for (int i = 0; i < spinner.getCount(); i++) {
//             if (value.equals(spinner.getItemAtPosition(i))) {
//                 setSelection(spinner, i, cancelListener);
//                 return true;
//             }
//         }
//         return false;
//     }
// 
//     public static void setSelection(@NonNull Spinner spinner, int position, boolean cancelListener) {
//         if (cancelListener) {
//             AdapterView.OnItemSelectedListener listener = spinner.getOnItemSelectedListener();
//             if (listener != null) {
//                 spinner.setOnItemSelectedListener(null);
//             }
//             spinner.setSelection(position, false);
//             if (listener != null) {
//                 spinner.setOnItemSelectedListener(listener);
//             }
//         } else {
//             spinner.setSelection(position);
//         }
//     }
// 
//     public static void dismissPopup(@NonNull Spinner spinner) {
//         // Does not come to mind is a good way to other...
//         Class<?> clazz = spinner.getClass();
//         Object popup = null;
//         while (popup == null && clazz != null) {
//             try {
//                 Field field = clazz.getDeclaredField("mPopup");
//                 field.setAccessible(true);
//                 popup = field.get(spinner);
//                 if (popup != null) {
//                     popup.getClass().getMethod("dismiss").invoke(popup);
//                     return;
//                 }
//             } catch (Exception e) {
//                 // ignore
//             }
//             clazz = clazz.getSuperclass();
//         }
//     }
// }


// Path: example/src/main/java/net/cattaka/android/adaptertoolbox/example/view/SpinnerEx.java
import android.content.Context;
import android.content.res.Resources;
import android.support.v7.widget.AppCompatSpinner;
import android.util.AttributeSet;
import net.cattaka.android.adaptertoolbox.utils.SpinnerUtils;

package net.cattaka.android.adaptertoolbox.example.view;



/**
 * Created by takao on 2016/06/11.
 */
public class SpinnerEx extends AppCompatSpinner {
    public SpinnerEx(Context context) {
        super(context);
    }

    public SpinnerEx(Context context, int mode) {
        super(context, mode);
    }

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

    public SpinnerEx(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public SpinnerEx(Context context, AttributeSet attrs, int defStyleAttr, int mode) {
        super(context, attrs, defStyleAttr, mode);
    }

    public SpinnerEx(Context context, AttributeSet attrs, int defStyleAttr, int mode, Resources.Theme popupTheme) {
        super(context, attrs, defStyleAttr, mode, popupTheme);
    }

    public Object getSelectedItem() {
        return getItemAtPosition(getSelectedItemPosition());
    }

    public void setSelectedItem(Object value) {
        SpinnerUtils.selectSpinnerValue(this, value);