2013-11-01 3 views
7

aufgerufen, ich weiß, dass dies mehrmals gefragt wurde, aber auf neueren Android-Plattform sieht es so aus, dass die vorgeschlagenen Lösungen nicht funktioniert (wie andere dasselbe gesagt). Ich brauche, dass meine Spinner noch OnItemSelected aufrufen, auch wenn der Benutzer das gleiche Element zweimal auswählen. Ich habe es geschafft, diese Klasse zu finden, die den Trick tun sollten:Android Spinner OnItemSelected nicht mit dem gleichen Element

public class NDSpinner extends Spinner { 

    private int lastSelected = 0; 
    private static Method s_pSelectionChangedMethod = null; 


    static {   
     try { 
      Class noparams[] = {}; 
      Class targetClass = AdapterView.class; 

      s_pSelectionChangedMethod = targetClass.getDeclaredMethod("selectionChanged", noparams);    
      if (s_pSelectionChangedMethod != null) { 
       s_pSelectionChangedMethod.setAccessible(true);    
      } 

     } catch(Exception e) { 
      Log.e("Custom spinner, reflection bug:", e.getMessage()); 
      throw new RuntimeException(e); 
     } 
    } 

    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 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    if(this.lastSelected == this.getSelectedItemPosition()) 
     testReflectionForSelectionChanged(); 
    if(!changed) 
     lastSelected = this.getSelectedItemPosition(); 

    super.onLayout(changed, l, t, r, b); 
} 



    public void testReflectionForSelectionChanged() { 
     try { 
      Class noparams[] = {};   
      s_pSelectionChangedMethod.invoke(this, noparams); 
     } catch (Exception e) { 
      Log.e("Custom spinner, reflection bug: ", e.getMessage()); 
      e.printStackTrace();     
     } 
    } 




    @Override 
    public void onClick(DialogInterface dialog, int which) {  
     super.onClick(dialog, which); 
    } 
} 

Diese infact funktioniert, aber es hat einen Fehler: es ist das Element zweimal rufen das erste Mal :( Kann jemand wissen, wie kann ich lösen ?. diese

Dank Kollegen

Antwort

14

ich habe mit dieser Klasse gelöst:

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

Danke trotzdem :)

+0

Nach mehreren Stunden Recherchen gefunden Ihre Antwort schließlich zu ändern. Du hast mir viel Zeit gespart. Danke, Mann. – Hesam

+0

Wie kann ich das in meiner Tätigkeit nutzen? –

+0

@HammadNasir ist es nur eine benutzerdefinierte Spinner. Verwenden Sie einfach das NDSpinner-Objekt anstelle des klassischen Spinner. –

0

Für mich habe ich AppCompatSpinner erweitert.

Auch wenn Ihr Spinneris in XML für das Layout, erinnern sich an Ihre

<Spinner... 

zu

<com.example.util.NDSpinner... 
Verwandte Themen