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



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



в основном то, что я пытаюсь сделать, это что-то вроде этого:



spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
//handle event
}
654   14  

14 ответов:

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

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

лучше использовать 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;
    } 
}); 

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

Spinner OnItemSelectedListener событие будет выполняться дважды:

  1. Spinner инициализация
  2. пользователь выбрал вручную

попробуйте дифференцировать эти два с помощью переменной-флага.

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

а затем использовать нижеприведенную строку внутри 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 должен быть в области объекта для этого, чтобы работать!

в документах для spinner-widget говорится: "spinner не поддерживает события щелчка элемента." Вы должны использовать "setOnItemSelectedListener" для решения вашей проблемы

spinner1.setOnItemSelectedListener(
    new AdapterView.OnItemSelectedListener() {
        //add some code here
    }
);

найдите свое имя spinner и найдите id, а затем реализуйте этот метод.

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:

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>

неважно, будете ли вы устанавливать 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;
            }
        });

Если вы хотите true 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
            }
        );

блестящая выше Стефан автомобиль можно оставить также мне очень помогли. Спасибо. Я новичок, и"@Override "в нем вызвал ошибку О"должен переопределить метод суперкласса с тем же именем". Eclipse предложил мне удалить переопределения. Когда я это сделал, это сработало. Пожалуйста, не спрашивайте меня, как и почему.

лучший способ, который я думаю, будет иметь flagitemselected=0; в oncreate. И на выбранном событии элемента увеличьте этот флаг, т. е. flagitemselected++; а затем проверьте, если(flagitemselected!=1){// делать свою работу здесь}.Это поможет я думаю

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

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

Comments

    Ничего не найдено.