Как сделать так, чтобы на выбранном элементе автоматически не выбиралась первая запись

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

Вот код:

<code>public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
        long arg3) {
    // TODO Auto-generated method stub
    startActivity(new Intent("com.lukeorpin.theappliancekeeper.APPLIANCESELECTED"));
    }

public void onNothingSelected(AdapterView<?> arg0) {
    // TODO Auto-generated method stub
</code>

Кто-нибудь знает способ, которым первый элемент в списке не будет выбран автоматически?

Вот код для остальной части счетчика:

<code>ArrayAdapter<String> appliancenameadapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, ApplianceNames); //Sets up an array adapter containing the values of the ApplianceNames string array
    applianceName = (Spinner) findViewById(R.id.spinner_name); //Gives the spinner in the xml layout a variable name
    applianceName.setAdapter(appliancenameadapter); //Adds the contents of the array adapter into the spinner

    applianceName.setOnItemSelectedListener(this);
</code>
 David d C e Freitas28 янв. 2015 г., 13:46
 twaddington13 апр. 2012 г., 00:57
Вы вызываете setSelection на Spinner? Как выглядит остальная часть вашего кода активности?
 Sketzii13 апр. 2012 г., 01:27
Я добавил код в основной вопрос, спасибо

Ответы на вопрос(4)

Если вы пытаетесь избежать первоначального вызова ваших слушателейonItemSelected() метод, другой вариант заключается в использованииpost() воспользоваться преимуществами просмотра очереди сообщений. В первый раз, когда счетчик проверяет ваш слушатель, он еще не будет установлен.

// Set initial selection
spinner.setSelection(position);

// Post to avoid initial invocation
spinner.post(new Runnable() {
  @Override public void run() {
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
      @Override
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        // Only called when the user changes the selection
      }

      @Override
      public void onNothingSelected(AdapterView<?> parent) {
      }
    });
  }
});
 28 мар. 2016 г., 09:36
очень крутой, как магия. оно работает.
 12 июл. 2018 г., 09:08
Идеальный ответ!
 27 сент. 2016 г., 12:02
Помог мне найти свой путь, спасибо
 24 окт. 2017 г., 03:23
очень очень хороший ответ

Объявить переменную isSpinnerInitial  затем сделать выбор в качестве выбора по умолчанию

spinnertaggeview.setSelection (-1); не делает выбор как -1 или все невыбранные, как мы делаем в .Net или другом языке. Таким образом, вы можете игнорировать эту линию.

testStringArrayListinside.add("Make a Selection");
ADD this line so that this is selected by default and user never selects it 

testStringArrayList = (ArrayList<String>) ClinqLinX.get("Tag");
                boolean added = false;
             testStringArrayListinside.add("Make a Selection");
                for (String s : testStringArrayList) {
                    if (s != null || s != "") {
                        String[] results = s.split(","); // split on commas

                        for (String string : results) {

                            testStringArrayListinside.add(string);
                            Toast.makeText(getContext(), string, Toast.LENGTH_SHORT).show();
                            added = true;
                        }
                    }

                }
                if (added == false) {
                    testStringArrayListinside.add("Not tagged details found");
                }

                spinnertaggeview.refreshDrawableState();

            }

            // Adapter: You need three parameters 'the context, id of the layout (it will be where the data is shown),
            // and the array that contains the data
            if (testStringArrayListinside.size() > 0) {
                adapter = new ArrayAdapter<String>(this.getContext(),android.R.layout.select_dialog_singlechoice, testStringArrayListinside);
                adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                // Here, you set the data in your ListView
                spinnertaggeview.setAdapter(adapter);
                 isSpinnerInitial = true;

                spinnertaggeview.setSelection(-1);
                spinnertaggeview.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

                    @Override
                    public void onItemSelected(AdapterView<?> arg0, View arg1,
                                               int arg2, long arg3) {
                        if (isSpinnerInitial){

                            isSpinnerInitial = false;

                            return;}
                        else{
                        TextView tv = (TextView) arg1;
                        String spinner_value = tv.getText().toString();
                        if (spinner_value.length() == 0) {
                            spinner_value = "Nothing";
                        }
                        String strusername = spinner_value;//As you are using Default String Adapter
                        Toast.makeText(getContext(), strusername, Toast.LENGTH_SHORT).show();
                        Intent intent = new Intent(spinnertaggeview.getContext(), Userdetails.class);
                        intent.putExtra("Username", strusername);
                        spinnertaggeview.getContext().startActivity(intent);}

                    }
Решение Вопроса

Does anyone know a way in which the first item on the list wont be automatically selected?

Естьalways выбор наSpinnerи вы не можете это изменить.

ИМХО, вы не должны использоватьSpinner запустить начало деятельности.

При этом, вы можете использоватьboolean отслеживать, является ли это первым событием выбора, и игнорировать его, если оно есть.

 Sketzii13 апр. 2012 г., 02:52
Спасибо за помощь, мне удалось решить эту проблему с помощью логического флага
 16 апр. 2012 г., 00:06
@CommonsWare Знаете ли вы, как управлять этим делом сSpinners используется в строкахListView? МетодgetView() может вызываться несколько раз для каждой строки, поэтому, я думаю, мы не можем использовать логический подход в этом случае ... Есть идеи? Я реализовал это с помощью кнопок и AlertDialogs с элементами SingleChoice, заполненными из курсора; но на самом деле это "взлом".
 13 апр. 2012 г., 02:02
Добавитьboolean isFirstSelection=true; член данных вашей деятельности. ВonItemSelected(), еслиisFirstSelection==true, а затем просто переверните егоfalseиначе позвониstartActivity(), Новички в Java должны потратить некоторое время на изучение Java вне Android, прежде чем заниматься разработкой для Android.
 16 апр. 2012 г., 00:13
@Caumons: я бы никогда не мечтал поставитьSpinners вListView.
 Sketzii13 апр. 2012 г., 01:58
Как мне создать булевский флаг для этого? Я очень новичок в Java, спасибо

private boolean isSpinnerInitial = true;

    @Override
    public void onItemSelected(AdapterView<?> parent, View view,
            int position, long id) {

        if(isSpinnerInitial)
        {
            isSpinnerInitial = false;
        }
        else  {
            // do your work...
        }

    }
 22 июн. 2015 г., 06:08
Я понимаю ответ. У меня такое же требование, но onItemSelected, Элемент в позиции сначала не выбран, мне пришлось выбрать элемент 2 позиции, а затем была выбрана первая позиция. Надеюсь, ты теперь понимаешь, что я говорю
 19 июн. 2015 г., 14:36
Вы не можете прочитать вопрос ... В нем просто говорится "Как сделать, чтобы выбранный элемент не выбирал автоматически первую запись" Так что это для всех разработчиков, которые не хотят, чтобы выбрана 1-я позиция.
 19 июн. 2015 г., 14:02
при этом первая позиция не выбрана

Ваш ответ на вопрос