Событие Spinner OnclickListener выполняется дважды, как обрабатывать оба события - PullRequest
5 голосов
/ 22 августа 2011

Событие Spinner OnclickListener выполняется дважды -

  • Инициализация спиннера
  • Пользователь выбран вручную

, где реализация слушателя имеет вид:

spinner.setOnItemSelectedListener(new OnItemSelectedListener() {           
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

            }

            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

Определение проблемы

Я хочу сохранить выбранный пользователем текст в хранилище данных, когда пользователь выбирает любой элемент из счетчика, и я могу сделатьэтот.Но моя другая задача состоит в том, чтобы показать ранее выбранный элемент (доступ из хранилища данных) как выбранный элемент в счетчике, но каждый раз, когда я вызываю действие счетчика, счетчик отображает первый элемент как выбранный по умолчанию элемент, а также в хранилище данных он изменяет предыдущийэлемент по умолчанию.

Как я могу сделать различие между событиями «Инициализация спиннера» и «Пользователь выбран вручную»?

Ответы [ 2 ]

7 голосов
/ 22 августа 2011

Вы должны обрабатывать оба события логически.Поскольку эти ссылки ( Выбор Android Spinner , проблема на 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.
            }
        });

    }

}

Надеюсь, это очистит ваши сомнения.

0 голосов
/ 02 апреля 2016

Вы можете вызвать setSelection одновременно с добавлением элементов в адаптер, см. Этот пример: Как избежать вызова onItemSelected дважды в Spinners

...