После того, как я долго выдергивал свои волосы, я создал свой собственный класс Spinner. Я добавил метод, который отключает и подключает слушателя соответствующим образом.
public class SaneSpinner extends Spinner {
public SaneSpinner(Context context) {
super(context);
}
public SaneSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SaneSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
// set the ceaseFireOnItemClickEvent argument to true to avoid firing an event
public void setSelection(int position, boolean animate, boolean ceaseFireOnItemClickEvent) {
OnItemSelectedListener l = getOnItemSelectedListener();
if (ceaseFireOnItemClickEvent) {
setOnItemSelectedListener(null);
}
super.setSelection(position, animate);
if (ceaseFireOnItemClickEvent) {
setOnItemSelectedListener(l);
}
}
}
Используйте его в своем XML, как это:
<my.package.name.SaneSpinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/mySaneSpinner"
android:entries="@array/supportedCurrenciesFullName"
android:layout_weight="2" />
Все, что вам нужно сделать, это извлечь экземпляр SaneSpinner после инфляции и выбрать набор вызовов следующим образом:
mMySaneSpinner.setSelection(1, true, true);
При этом событие не запускается, и взаимодействие с пользователем не прерывается. Это значительно уменьшило сложность моего кода. Это должно быть в наличии Android, так как это действительно PITA.