Spinner onItemSelected с уже выбранным элементом - PullRequest
14 голосов
/ 21 ноября 2011

У меня есть Spinner с onItemSelected, который работает, но как говорит спецификация Api:

Этот обратный вызов вызывается только в том случае, если вновь выбранная позиция отличается от ранее выбранной позиции илиесли не было выделенного элемента.

Мне нужно снять это ограничение, и я хочу, чтобы обратный вызов вызывался также, если пользователь выбирает тот же элемент.Как это сделать?Я прочитал предложение о расширении класса Spinner и установил позицию на INVALID_POSITION, но я не понял / не смог этого сделать.Кто-нибудь делал то же самое?

Ответы [ 6 ]

1 голос
/ 10 апреля 2014

Мне также нужно было решить эту проблему.То, что я хотел сделать, это иметь Spinner, который имеет диапазоны дат с настраиваемым параметром диапазона.Строки будут выглядеть примерно так:

10 апреля - 10 мая 10
10 марта - 10 апреля
10 февраля - 10 марта
Пользовательский диапазон

проблема заключается в том, что если пользователь выбирает пользовательский диапазон, а затем хочет изменить свой пользовательский диапазон, ему необходимо выбрать другой диапазон, а затем снова выбрать параметр пользовательского диапазона.Я хотел, чтобы пользователь снова мог выбрать «Пользовательский диапазон», чтобы снова можно было отобразить диалоговое окно пользовательского диапазона.

Я субклассировал Spinner и создал моего собственного слушателя.Код переключает выбор, но затем немедленно переключает его, чтобы ничего не было выбрано.В моем слушателе я просто игнорирую любую позицию, которая меньше нуля.

Spinner просто отображает последний выбранный элемент.Я создал собственный настраиваемый адаптер и указал, что отображать для каждого представления, но в этом нет необходимости.Вот как я подклассифицировал Spinner.

package com.example.widget;

import android.content.Context;
import android.widget.Spinner;

public class DateRangeSpinner extends Spinner {

private ItemSelectionListener listener;

public DateRangeSpinner(Context context) {
    super(context);
}

/**
 * This listener will be fired every time an item is selected,
 * regardless of whether it has already been selected or not.
 * 
 * @param l
 */
public void setOnItemSelectedListener(ItemSelectionListener l) {
    listener = l;
}

public void removeOnItemSelectedListener() {
    listener = null;
}

@Override
public void setSelection(int position) {
    setSelection(position, true);
}

@Override
public void setSelection(int position, boolean animate) {
    if (listener != null) {
        listener.onItemSelected(position);
    }
    super.setSelection(position, animate);
    super.setSelection(-1, animate);
}   

public interface ItemSelectionListener {
    public void onItemSelected(int position);
}

}

Надеюсь, это поможет!

0 голосов
/ 16 января 2014

Используйте OnItemClickListener вместо itemSelectedListener. Это будет работать для каждого клика, одинакового или разного.

0 голосов
/ 28 ноября 2013

Это элемент счетчика с настраиваемым диалоговым режимом и подсказкой для вывода:

<Spinner
    android:id="@+id/spinner_metatag"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:entries="@array/search_adv" 
/>

Элемент Array, в котором значение по умолчанию помещается в позицию 0:

<string-array name="search_adv">
    <item>@string/search_adv_prompt</item>
    <item>@string/search_adv_title</item>
    <item>@string/search_adv_desc</item>
    <item>@string/search_adv_autore</item>
    ....
</string-array>

Элементы Stringдля массива со значением по умолчанию:

<string name="search_adv_prompt">Scegli un metatag</string> <!-- Default value-->
<string name="search_adv_title">Titolo</string> 
<string name="search_adv_desc">Descrizione</string> 
<string name="search_adv_autore">Autore</string>
...

А вот код для предотвращения возникновения события onCreateMethod и обходной путь, позволяющий выбрать тот же элемент, который уже выбран:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search_adv_main);

    spinner = (Spinner) findViewById(R.id.spinner_metatag);

    spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View view, int pos,long id) {
            //prevent onCreate event fire and the loop
            if(pos==0)
                return;

            //HERE YOUR CODE

            //at the end move to the default element the spinner
            spinner.setSelection(0);
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {}
    });
}

Надежда помогает.Идея возникла из второго решения Ответа TreKing

0 голосов
/ 21 ноября 2013

почему вы снова выбрали выбранный пункт.Просто дайте кнопку обновления, если хотите снова выполнить эту задачу.

0 голосов
/ 21 ноября 2011

Полагаю, вы должны хранить значение в переменной, инициализировать переменную с -1.И изменяйте значение по мере того, как пользователь выбирает спиннер элемента, если значение равно -1, попросите пользователя повторно выбрать или что угодно.

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

0 голосов
/ 21 ноября 2011

Вы можете сделать это с помощью специального адаптера, например, создать макет желаемых видов, затем накачать его в специальном адаптере, а затем с помощью функции onItemClick вы можете получить представление с помощью этой функции.

Чтобы различать каждое представление, необходимо установить тег для каждой строки.

Это, вероятно, работает в вашем состоянии.

Дайте мне знать, если у вас есть

...