Spinner OnclickListener событие выполняется дважды, как обрабатывать оба события
Событие Spinner OnclickListener выполняется дважды -
- инициализация спиннера
- пользователь, выбранный вручную
Где в качестве реализации слушателя выступает:
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
}
public void onNothingSelected(AdapterView<?> parent) {
}
});
определение проблемы
Я хочу сохранить выбранный пользователем текст в хранилище данных, когда пользователь выбирает любой элемент из spinner, и я могу это сделать. Но моя другая задача состоит в том, чтобы показать ранее выбранный элемент (доступ из хранилища данных) как выбранный элемент в spinner, но каждый раз, когда я вызываю активность spinner, spinner показывает Первый элемент как выбранный по умолчанию элемент, а также в хранилище данных он изменяет предыдущий элемент на default.
Как я могу сделать разницу между событиями "инициализация Spinner" и "пользователь, выбранный вручную"?
2 ответа:
вы должны обрабатывать оба события логически. В качестве этих ссылок (Android Spinner selection, проблема на spinner) говорит, что вы должны использовать переменную flag для обработки этого, я ставлю образец кода.
Надеюсь, это поможет вам прояснить вашу логику.
public class TestActivity extends Activity { //Checks report spinner selection is default or user selected item private boolean isDefaultSelection; //Spinner setup Spinner spinner; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); // Set true at onCreate isDefaultSelection = true; spinner = (Spinner) findViewById(R.id.id_of_spinner); ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String> (this, R.layout.drop_down_custom_row, data); //Implement custom view for drop down of spinner //spinnerAdapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(spinnerAdapter); spinner.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { if(isDefaultSelection) { //If spinner initializes spinner.setSelection("Set_here_id_of_data_item_from_storage_which_was_previously_stored"); isDefaultSelection = false; } else { //If user manually select item int itemPosition = spinner.getSelectedItemPosition(); //Write here code to store selection (itemPosition) of user into data storage } } public void onNothingSelected(AdapterView<?> parent) { //User selected same item. Nothing to do. } }); } }
Надеюсь, что это очистит ваши сомнения.
Вы можете вызвать
setSelection
одновременно с добавлением элементов в адаптер, см. Этот пример: Как избежать повторного вызова onItemSelected в Spinners