Событие пожаротушения андроида при создании одного и того же элемента
Я хочу запустить событие, когда тот же элемент выбран в spinner. Метод
@Override
public void onItemSelected(AdapterView<?> parent, View arg1, int position,
long arg3) {
}
вызывается только тогда, когда мы делаем разный выбор. Моя цель состоит в том, чтобы отображать тост, когда выбран какой-либо элемент, либо тот же элемент повторно выбран, либо сделан другой выбор.
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
выше метод не решает мою проблему.
Ответы
Ответ 1
используйте функцию прослушивания кликов для выполнения вашего требования. так как прямой клик-прослушиватель на spinner не поддерживается, поэтому заставьте класс расширять spinner и переходить по методу кликов и в этом методе делать то, что вы хотите сделать.
Ответ 2
Я обнаружил, что старый выбор хранится в переменной mOldSelectedPosition в иерархии счетчика. Spinner использует это значение, чтобы проверить, выбран ли тот же самый элемент или нет, и если он тот же, он игнорирует. Если мы не хотим игнорировать это Что я сделал - это какой-то грязный код, использующий отражение.
package com.aradiom.amc.nativecomponents;
import java.lang.reflect.Field;
import android.content.Context;
import android.util.Log;
import android.widget.Spinner;
public class SpinnerTrigger extends Spinner {
public SpinnerTrigger(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
public void setSelection(int position, boolean animate) {
ignoreOldSelectionByReflection();
super.setSelection(position, animate);
}
private void ignoreOldSelectionByReflection() {
try {
Class<?> c = this.getClass().getSuperclass().getSuperclass().getSuperclass();
Field reqField = c.getDeclaredField("mOldSelectedPosition");
reqField.setAccessible(true);
reqField.setInt(this, -1);
} catch (Exception e) {
Log.d("Exception Private", "ex", e);
// TODO: handle exception
}
}
@Override
public void setSelection(int position) {
ignoreOldSelectionByReflection();
super.setSelection(position);
}
}
Этот класс всегда будет аннулировать значение oldselection, так что каждый раз при нажатии на событие click срабатывает.
Это может быть не идеальное решение. Используйте с осторожностью.:)
Ответ 3
Надеюсь, эта помощь. Я пробовал и работает
/** Spinner extension that calls onItemSelected even when the selection is the same as its previous value */
public class NDSpinner extends Spinner {
public NDSpinner(Context context)
{ super(context); }
public NDSpinner(Context context, AttributeSet attrs)
{ super(context, attrs); }
public NDSpinner(Context context, AttributeSet attrs, int defStyle)
{ super(context, attrs, defStyle); }
@Override public void
setSelection(int position, boolean animate)
{
boolean sameSelected = position == getSelectedItemPosition();
super.setSelection(position, animate);
if (sameSelected) {
// Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
}
}
@Override public void
setSelection(int position)
{
boolean sameSelected = position == getSelectedItemPosition();
super.setSelection(position);
if (sameSelected) {
// Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
}
}
}
Ответ 4
Так как моя репутация недостаточно высока, чтобы комментировать непосредственно ответ @Suat, я пробовал этот метод, он работает как шарм, но я не понимаю, какие побочные эффекты могут быть.
Что-то, что я хочу добавить, добавить дополнительные конструкторы, чтобы избежать ошибок.
public SpinnerTrigger(Context context, AttributeSet attrs, int defStyle)
{ super(context, attrs, defStyle); }
public SpinnerTrigger(Context context, AttributeSet attrs){
super(context,attrs);
}
Ответ 5
Вы можете добавить имя метода в свой выбранный элемент МЕТОД
Spinner `Spinner1`=(Spinner)findViewById(R.id.`declareid`)
oBject объявлен для spinner
@Override
public void onItemSelected(AdapterView<?> parent, View arg1, int position,
long arg3)
{
ItemOnChange();
}
private void ItemOnChange() {
if(Spinner1.getSelectedItemPosition()>0){
pd=ProgressDialog.show(this,"","Loading, Please wait .. ",true);
final int spinner=Spinner1.getSelectedItemPosition();
final Handler ThreadCallback=new Handler();
final Runnable runInCityThread=new Runnable(){
public void run(){
fnBindspimmer2();
pd.dismiss();
}
};
new Thread(){
@Override public void run(){
Spinner2values();
ThreadCallback.post(runInCityThread);
}
}.start();
}
}