2012-01-20 10 views
10

同じアイテムがスピナーで選択されたときにイベントを発生させたい。方法アンドロイドスピナー火災イベント同じアイテムを選択した場合

@Override 
    public void onItemSelected(AdapterView<?> parent, View arg1, int position, 
      long arg3) { 
    } 

は別の選択をした場合のみ呼び出されます。私の目的は、同じアイテムが選択されたとき、または同じアイテムが選択されたとき、または異なるアイテムが選択されたときにトーストを表示することです。

@Override 
    public void onNothingSelected(AdapterView<?> parent) { 

    } 

上記の方法では私の問題は解決しません。あなたがあなたの商品にメソッド名を追加することができます

+0

可能性のある重複した作品[現在の選択項目が再び選択されたとき、どのように私はAndroidのスピナーでイベントを取得することができますか?](http://stackoverflow.com/questions/5335306/how-can -i-get-an-event-in-android-spinner-when-current-selected-item-sele) –

答えて

0

のために宣言されています。スピナーのダイレクトクリックリスナーはサポートされていませんので、クラスをスピンナーを拡張し、クリックメソッドで乗り越えるようにしてください。このメソッドでは、あなたがしたいことをします。

2

METHOD

Spinner `Spinner1`=(Spinner)findViewById(R.id.`declareid`) 

を選択したオブジェクトは、あなたの要件を満たすために、リスナーをクリックして使用スピナー

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



} 
18

私は、古い選択が、スピナーの階層で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値が無効になります。 完全な解決策ではないかもしれません。慎重に使用してください。 :)

+0

素晴らしい解決策!私はこれを何時間も割くことを試みてきました。ありがとう! – nathanielwolf

+0

良い。ありがとう、私の問題を解決しました。 –

3

私の評判が@Suatの答えに直接コメントするのに十分ではないので、私はその方法を試しました。それは魅力的ですが、副作用が何であるかはわかりません。 追加したいことは、エラーを避けるために追加のコンストラクタを追加する必要があることです。

public SpinnerTrigger(Context context, AttributeSet attrs, int defStyle) 
{ super(context, attrs, defStyle); } 

public SpinnerTrigger(Context context, AttributeSet attrs){ 
super(context,attrs); 

}

6

うまくいけば、このヘルプ。私が試した、それはの

/** 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()); 
     } 
     } 
    } 
+0

4.4.2 =でチャームのように働く) –

関連する問題