2012-01-20 17 views
10

मैं एक घटना को आग लगाना चाहता हूं जब स्पिनर में वही आइटम चुना जाता है। विधिएंड्रॉइड स्पिनर आग घटना जब एक ही आइटम चयन किया जाता है

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

केवल तभी कॉल किया जाता है जब हम अलग-अलग चयन किए जाते हैं। मेरा उद्देश्य टोस्ट को प्रदर्शित करना है जब किसी भी आइटम का चयन किया जाता है या तो एक ही आइटम को संशोधित किया जाता है या अलग-अलग चयन किया जाता है।

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

    } 

विधि से ऊपर मेरी समस्या का समाधान नहीं करता है।

+0

संभावित डुप्लिकेट [मैं एंड्रॉयड स्पिनर में एक घटना कैसे प्राप्त कर सकते हैं जब वर्तमान चयनित आइटम फिर से चयन किया जाता है?] (Http://stackoverflow.com/questions/5335306/how-can -आई-गेट-ए-इवेंट-इन-एंड्रॉइड-स्पिनर-कब-वर्तमान-चयनित-आइटम-एस-सेल) –

उत्तर

0

उपयोग क्लिक श्रोता आपकी आवश्यकता को पूरा करने के लिए जोड़ सकते हैं। क्योंकि स्पिनर पर प्रत्यक्ष क्लिक श्रोता समर्थित नहीं है, इसलिए क्लास को स्पिनर का विस्तार करें और क्लिक विधि पर सवारी करें और इस विधि में आप जो करना चाहते हैं उसे करें।

2

आप एक विधि नाम अपने आइटम का चयन किया विधि

पर
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

मुझे पता चला है कि पुराना चयन स्पिनर की पदानुक्रम में mldldelectedPosition नामक चर पर रखा जाता है। स्पिनर इस मान का उपयोग यह जांचने के लिए कर रहा है कि क्या वही आइटम चुना गया है या नहीं, और यदि यह वही है, तो यह अनदेखा करता है। अगर हम इसे अनदेखा नहीं करना चाहते हैं तो मैंने प्रतिबिंब का उपयोग करके कुछ गंदा कोड किया है।

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

} 

यह कक्षा हमेशा पुराने चयन मान को अमान्य कर देगी, ताकि क्लिक ईवेंट पर हर बार ट्रिगर हो जाए। यह सही समाधान नहीं हो सकता है। सावधानी से प्रयोग करें। :)

+0

ग्रेट सॉल्यूशन! मैं घंटों के लिए इसे तोड़ने की कोशिश कर रहा हूं। धन्यवाद! – nathanielwolf

+0

अच्छा एक। धन्यवाद, यह मेरी समस्या हल हो गया। –

3

चूंकि मेरी प्रतिष्ठा सीधे @ सूट के उत्तर पर टिप्पणी करने के लिए पर्याप्त नहीं है, इसलिए मैंने उस विधि की कोशिश की, यह आकर्षण की तरह काम करता है, लेकिन मुझे स्पष्ट नहीं है कि दुष्प्रभाव क्या हो सकते हैं। जो कुछ मैं जोड़ना चाहता हूं वह है, त्रुटियों से बचने के लिए अतिरिक्त रचनाकारों को जोड़ा जाना चाहिए।

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 = पर एक आकर्षण की तरह काम कर रहा है) –

संबंधित मुद्दे