Хорошо, я думаю, что нашел решение для моей собственной ситуации с помощью ответа Дэвида и Феликса (я думаю, Дэвид помог Феликсу, который, в свою очередь, помог моему). Я подумал опубликовать его здесь вместе с примером кода на тот случай, если кто-то найдет такой подход полезным. Это также решает обе мои проблемы (как нежелательный автоматический выбор, так и требуемый триггер повторного выбора).
Что я сделал, так это добавление фиктивного элемента ", пожалуйста, выберите " в качестве первого элемента в моем списке (изначально просто для того, чтобы обойти проблему с автоматическим выбором, чтобы я мог ее игнорировать, когда она была выбрана без взаимодействие с пользователем), а затем, когда выбран другой элемент и я обработал выделение, я просто сбрасываю счетчик на фиктивный элемент (который игнорируется). Если подумать, мне следовало бы подумать об этом давным-давно, прежде чем я решил разместить свой вопрос на этом сайте, но в ретроспективе вещи всегда более очевидны ... и я обнаружил, что написание своего вопроса действительно помогло мне подумать о том, что Я хотел достичь.
Очевидно, что наличие фиктивного элемента не подходит для вашей ситуации, это может быть не идеальным решением для вас, но так как я хотел, чтобы вызвать действие, когда пользователь выбрал значение (и если значение остается выбранным) не требуется в моем конкретном случае), это работает просто отлично. Я попытаюсь добавить пример упрощенного кода (может не скомпилироваться как есть, я вырвал несколько бит из моего рабочего кода и переименовал вещи перед вставкой, но, надеюсь, вы поймете идею) ниже.
Во-первых, список действий (в моем случае), содержащий счетчик, назовем его MyListActivity:
public class MyListActivity extends ListActivity {
private Spinner mySpinner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// TODO: other code as required...
mySpinner = (Spinner) findViewById(R.id.mySpinner);
mySpinner.setAdapter(new MySpinnerAdapter(this));
mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> aParentView,
View aView, int aPosition, long anId) {
if (aPosition == 0) {
Log.d(getClass().getName(), "Ignoring selection of dummy list item...");
} else {
Log.d(getClass().getName(), "Handling selection of actual list item...");
// TODO: insert code to handle selection
resetSelection();
}
}
@Override
public void onNothingSelected(AdapterView<?> anAdapterView) {
// do nothing
}
});
}
/**
* Reset the filter spinner selection to 0 - which is ignored in
* onItemSelected() - so that a subsequent selection of another item is
* triggered, regardless of whether it's the same item that was selected
* previously.
*/
protected void resetSelection() {
Log.d(getClass().getName(), "Resetting selection to 0 (i.e. 'please select' item).");
mySpinner.setSelection(0);
}
}
И код адаптера счетчика может выглядеть примерно так (фактически, если хотите, это может быть внутренний класс в приведенном выше списке действий):
public class MySpinnerAdapter extends BaseAdapter implements SpinnerAdapter {
private List<MyListItem> items; // replace MyListItem with your model object type
private Context context;
public MySpinnerAdapter(Context aContext) {
context = aContext;
items = new ArrayList<MyListItem>();
items.add(null); // add first dummy item - selection of this will be ignored
// TODO: add other items;
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int aPosition) {
return items.get(aPosition);
}
@Override
public long getItemId(int aPosition) {
return aPosition;
}
@Override
public View getView(int aPosition, View aView, ViewGroup aParent) {
TextView text = new TextView(context);
if (aPosition == 0) {
text.setText("-- Please select --"); // text for first dummy item
} else {
text.setText(items.get(aPosition).toString());
// or use whatever model attribute you'd like displayed instead of toString()
}
return text;
}
}
Я думаю (не пробовал этого) того же эффекта можно было бы достичь, используя setSelected(false)
вместо setSelection(0)
, но повторная установка "пожалуйста, выберите" подходит моим целям. И "смотри, Ма, нет флага!" (Хотя я думаю, игнорирование 0
выборов не так уж и отличается.)
Надеюсь, это может помочь кому-то еще с аналогичным вариантом использования. :-) Для других случаев использования ответ Феликса может быть более подходящим (спасибо Феликсу!).