Spinner onItemSelected с уже выбранным товаром
У меня есть Spinner с onItemSelected
interation, который работает, но как спецификация Api говорит:
Этот обратный вызов вызывается только тогда, когда вновь выбранная позиция отличается от ранее выбранной позиции или если не было выбранный элемент.
Мне нужно удалить это ограничение, и я хочу, чтобы обратный вызов вызывался также, если пользователь выбирает один и тот же элемент.
Как это сделать? Я прочитал предложение о расширении класса Spinner и установил позицию INVALID_POSITION
, но я не понял/не смог этого сделать.
Кто-то сделал то же самое?
Ответы
Ответ 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.