2013-02-25 4 views
11

setOnItemClickListener funktioniert nicht mit Spinner. Hier ist mein Code ...setOnItemClickListener funktioniert nicht mit Spinner

supplier.setOnItemClickListener(new OnItemClickListener() { 

       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, 
         long id) { 
        // TODO Auto-generated method stub 

        String msupplier=supplier.getSelectedItem().toString(); 
        Log.e("Selected item : ",msupplier); 

       } 
      }); 
+0

Können Sie mehr Code für diese Aktivität bereitstellen? –

+0

Bitte fügen Sie Ihren Adapter-Code und die Xml Ihrer Spinner-Artikel –

Antwort

41

setOnItemClickListener wird funktioniert nicht mit Spinnern. Versuchen Sie es mit dieser Methode:

setOnItemSelectedListener

Code ändern wie folgt vor:

supplier.setOnItemSelectedListener(new OnItemSelectedListener() { 

      @Override 
      public void onItemSelected(AdapterView<?> arg0, View arg1, 
        int arg2, long arg3) { 
       // TODO Auto-generated method stub 
       String msupplier=supplier.getSelectedItem().toString(); 

       Log.e("Selected item : ",msupplier); 
} 

      @Override 
      public void onNothingSelected(AdapterView<?> arg0) { 
       // TODO Auto-generated method stub 

      } 
     }); 
+4

Problem mit Spinner ist, dass Sie nur benachrichtigt werden, wenn Sie das ausgewählte Element geändert haben, und nie, wenn Sie auf das gleiche Element, also die Notwendigkeit für ein itemClicked-Ereignis. –

0

Ich denke supplier im Code bedeutet spinner, ersetzen Sie diese Zeile

String msupplier=supplier.getSelectedItem().toString(); 

mit der folgenden Zeile:

String msupplier= supplier.getItemAtPosition(position).toString(); 
1

Verwendung getItemAtPosition:

supplier.getItemAtPosition(position).toString(); 
3

ich vom Kurs abgekommen gehen kann, aber haben Sie vorschlagen OnItemSelectedListener zu verwenden, die für Spinner breiter als OnItemClickListener ist:

supplier.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, 
     long arg3) { 
     //do something here 
    } 
    @Override 
    public void onNothingSelected(AdapterView<?> arg0) { 
     //optionally do something here 
    } 
}); 
+0

Danke Waqas .... – Sonu

1

verwendet

supplier.setOnItemSelectedListener(new OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> arg0, View arg1, 
       int arg2, long arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
      // TODO Auto-generated method stub 

     } 
    }); 
5

1. Ich glaube, Sie sollten Ihre XML-Datei überprüfen, die den Spinner enthält. Stellen Sie sicher, dass android:clickable = "false" nicht eingestellt ist.

2. bitte Ihre Spinner Adapter überprüfen und sicher in Ihrem getView(int position, View convertView, ViewGroup parent) Methode machen, Sie haben kein Widget klicken Sie Callback-Ereignis gesetzt wie Button, Imageview, TextView

3

OnItemSelectedListener() dient einem anderen Zweck als einen Klick Hörer. Am wichtigsten ist, dass es nicht ausgelöst wird, wenn Sie erneut auf das aktuell ausgewählte Element klicken. In einigen Fällen ist dies möglicherweise kein Problem, in anderen Fällen jedoch sehr wohl. Die wirkliche Antwort besteht also nicht darin, den Leuten zu sagen, sie sollten einen anderen und wahrscheinlich ungeeigneten Hörer benutzen, sondern das ursprüngliche Problem lösen.

public class SpinnerClickAdapter extends BaseAdapter implements SpinnerAdapter { 
    protected OnItemClickListener listener; 

    public SpinnerClickAdapter(Context context, ..., OnItemClickListener listener) { 
    super(); 

    this.listener = listener; 
    } 

    @Override 
    public View getDropDownView(final int position, View convertView, final ViewGroup parent) { 
    if (convertView == null) 
     convertView = LayoutInflater.from(context).inflate(R.layout.yourlayout, false); 

    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     if (listener != null) 
      listener.onItemClick((AdapterView<?>) parent, v, position, getItemId(position)); 
     } 
    }); 


    // ... 

    return convertView; 
    } 
} 

und dann können wir es wie gewohnt, mit dem einzigen Unterschied, der nicht auf dem Spinner Einstellung, sondern auf das: Statt :-)

Zum Glück können wir den Klick-Listener auf dem Adapter platzieren Adapter stattdessen:

Spinner spinner = (Spinner) findViewById(R.id.yourspinner); 
SpinnerClickAdapter spinnerAdapter = new SpinnerClickAdapter(context, ..., new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    // TODO 
    } 
}); 
spinner.setAdapter(spinnerAdapter); 
+0

könnte man das komplette Arbeitsbeispiel geben. – Noman

+0

Hallo, nette Arbeit, aber wie Spinner nach Artikelauswahl zu reduzieren? –

0

Ich habe diese Probleme konfrontiert. setOnItemClickListener funktioniert nicht mit Spinner. Meine Lösung ist wie folgt:

mSpinnerYears.setAdapter(adapter); 
    mSpinnerYears.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      Logger.d(new StringBuilder(2).append("TAG:").append(TAG).toString(), 
        new StringBuilder(3).append("click pos = ").append(position).append(
          mSpinnerYears.getItemAtPosition(position).toString()).toString()); 
     } 

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

     } 
    });