Спиннер для Android:Получить событие изменения выбранного элемента

StackOverflow https://stackoverflow.com/questions/1337424

Вопрос

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

В принципе, то, что я пытаюсь сделать, это что-то похожее на это:

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}
Это было полезно?

Решение

Некоторые из предыдущих ответов неверны.Они работают для других виджетов и представлений, но документация для Виджет спиннера четко заявляет:

Счетчик не поддерживает события щелчка по элементу .Вызов этого метода вызовет исключение.

Лучшее использование OnItemSelectedListener() вместо этого:

spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        // your code here
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // your code here
    }

});

У меня это работает.

Обратите внимание, что метод onItemSelected также вызывается при сборке представления, поэтому вы можете рассмотреть возможность размещения его внутри onCreate() вызов метода.

Другие советы

Spinner spnLocale = (Spinner)findViewById(R.id.spnLocale);

spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
        // Your code here
    } 

    public void onNothingSelected(AdapterView<?> adapterView) {
        return;
    } 
}); 

Примечание: Помните одну вещь.

Спиннер OnItemSelectedListener событие будет выполнено дважды:

  1. Инициализация счетчика
  2. Пользователь выбран вручную

Попробуйте различить эти два значения, используя переменную-флаг.

Вы можете реализовать AdapterView.OnItemSelectedListener class в вашей деятельности.

А затем используйте строку ниже внутри onCreate()

Spinner spin = (Spinner) findViewById(R.id.spinner);
spin.setOnItemSelectedListener(this);

Затем переопределите эти два метода:

public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
    selection.setText(items[position]);
}

public void onNothingSelected(AdapterView<?> parent) {
    selection.setText("");
}

https://stackoverflow.com/q/1714426/811625

Вы можете избежать вызова OnItemSelectedListener() с помощью простой проверки:Сохраните текущий индекс выбора в целочисленной переменной и проверьте его в onItemSelected(..), прежде чем что-либо делать.

Например:

Spinner spnLocale;

spnLocale = (Spinner)findViewById(R.id.spnLocale);

int iCurrentSelection = spnLocale.getSelectedItemPosition();

spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
    if (iCurrentSelection != i){
            // Your code here
    }
    iCurrentSelection = i;
    } 

    public void onNothingSelected(AdapterView<?> adapterView) {
        return;
    } 
}); 

Конечно, iCurrentSelection чтобы это работало, оно должно находиться в области объекта!

Найдите свое имя счетчика и найдите идентификатор, а затем реализуйте этот метод.

spinnername.setOnItemSelectedListener(new OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        // your code here
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // your code here
    }
});

В документации к виджету spinner говорится:

Счетчик не поддерживает события щелчка элемента.

Вы должны использовать setOnItemSelectedListener чтобы справиться с вашей проблемой.

Неважно, установите ли вы OnItemSelectedListener в onCreate или onStart — он все равно будет вызываться во время создания или запуска действия (соответственно).
Таким образом, мы можем установить его в onCreate (а НЕ в onStart!).
Просто добавьте флаг, чтобы определить первую инициализацию:

private Spinner mSpinner;
private boolean mSpinnerInitialized;

затем в onCreate (или onCreateView) просто:

mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                if (!mSpinnerInitialized) {
                    mSpinnerInitialized = true;
                    return;
                }

                // do stuff
            }

            public void onNothingSelected(AdapterView<?> adapterView) {
                return;
            }
        });
spinner1.setOnItemSelectedListener(
    new AdapterView.OnItemSelectedListener() {
        //add some code here
    }
);

Если вам нужен настоящий onChangedListener().Сохраните начальное значение в обработчике и проверьте, изменилось ли оно.Это просто и делает нет требуется глобальная переменная.Работает, если на странице более одного счетчика.

String initialValue = // get from Database or your object
mySpinner.setOnItemSelectedListener(new SpinnerSelectedListener(initialValue));

...

protected class SpinnerSelectedListener implements AdapterView.OnItemSelectedListener {

        private SpinnerSelectedListener() {
            super();
        }

        public SpinnerSelectedListener(String initialValue) {
            this();
            this.initialValue = initialValue;
        }

        private String initialValue;

        // getter and setter removed.  

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            final String newValue = (String) spinHeight.getItemAtPosition(position);
            if (newValue.equals(initialValue) == false) {
               // Add your code here.  The spinner has changed value. 

               // Maybe useful.   
               // initialValue = newValue;
            }

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
               // Maybe useful.   
               // initialValue = null; 
        }
    }

Предметы — ваши друзья, используйте их.

spinner.setOnItemSelectedListener(
            new AdapterView.OnItemSelectedListener() {

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

                    // TODO Auto-generated method stub
                }

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

                }
                //add some code here
            }
        );

возьмите глобальную переменную для текущего выбора счетчика:

int currentItem = 0;

spinner_counter = (Spinner)findViewById(R.id.spinner_counter);
String[] value={"20","40","60","80","100","All"};
aa=new ArrayAdapter<String>(this,R.layout.spinner_item_profile,value);
aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner_counter.setAdapter(aa);

spinner_counter.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if(currentItem == position){
                return; //do nothing
            }
            else
            {
                 TextView spinner_item_text = (TextView) view;
                 //write your code here
            }
            currentItem = position;
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

//R.layout.spinner_item_profile
<?xml version="1.0" encoding="utf-8"?>

<TextView  android:id="@+id/spinner_item_text"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" 
android:layout_height="wrap_content"
android:background="@drawable/border_close_profile"
android:gravity="start"  
android:textColor="@color/black"         
android:paddingLeft="5dip"
android:paddingStart="5dip"
android:paddingTop="12dip"
android:paddingBottom="12dip"
/>

//drawable/border_close_profile
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
   <shape android:shape="rectangle">
    <solid android:color="#e2e3d7" />
   </shape>
 </item>
<item android:left="1dp"
android:right="1dp"
android:top="1dp"
android:bottom="1dp">
<shape android:shape="rectangle">
    <solid android:color="@color/white_text" />
</shape>
</item>
</layer-list>

Это сработает запустите счетчик и findviewbyid и используйте это, это сработает

    Spinner schemeStatusSpinner;

  schemeStatusSpinner = (Spinner) dialog.findViewById(R.id.spinner);

schemeStatusSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            // your code here
            if(schemeStatusSpinner.getSelectedItemId()==4){
                reasonll.setVisibility(View.VISIBLE);
            }
            else {
                reasonll.setVisibility(View.GONE);
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parentView) {
            // your code here
        }

    });

Я думаю, что лучший способ - это иметь flagitemselected = 0; в onCreate().И в выбранном элементе событие увеличивает этот флаг, т.е. flagitemselected++;а потом проверь

if(flagitemselected!=1)
{
// do your work here
}

Это поможет, я думаю.

Я обнаружил один трюк: поместил ваши setOnItemSelectedListeners в onWindowFocusChanged вместо onCreate.Я пока не обнаружил никаких плохих побочных эффектов от такого подхода.По сути, настройте прослушиватели после того, как окно будет нарисовано.Я не уверен, как часто запускается onWindowFocusChanged, но достаточно легко создать себе переменную блокировки, если вы обнаружите, что она запускается слишком часто.

Я думаю, что Android может использовать систему обработки сообщений, и если вы поместите все это в onCreate, вы можете столкнуться с ситуациями, когда счетчик заполняется после его отрисовки.Итак, ваш слушатель отключится после того, как вы установите местоположение элемента.Это, конечно, обоснованное предположение, но не стесняйтесь меня поправить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top