Подтвердить что ты не робот

Spinner onItemSelected с уже выбранным товаром

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

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

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

4b9b3361

Ответ 1

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

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);
}

}

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

Ответ 2

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

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

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

Сообщите мне любую проблему, если у вас есть

Ответ 3

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

Ответ 4

Это элемент spinner с настраиваемым диалоговым режимом и whitout promt:

<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) {}
    });
}

Надежда помогает. Идея исходит из второго решения из "Ответ на Трекинг"

Ответ 5

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

Ответ 6

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

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