Wie kann man vermeiden android spinner Anruf mit onitemselectedlistener, wenn der Adapter einstellen?

StackOverflow https://stackoverflow.com/questions/3637704

  •  30-09-2019
  •  | 
  •  

Frage

Es scheint, dass Spinner Klasse Android (und möglicherweise Listview im Allgemeinen, obwohl ich sicher weiß nicht) ruft Ihre OnItemSelectedListener die onItemSelected() Methode, nachdem Sie setAdapter() nennen, auch wenn der Benutzer nicht explizit noch nichts ausgewählt hat.

kann ich sehen, wie dies in vielen Situationen nützlich sein würde, aber es gibt Zeiten, in denen ich nur onItemSelected() wollen aufgerufen werden, wenn ein Element tatsächlich ist speziell ausgewählt.

Gibt es eine Möglichkeit, dieses Verhalten zu kontrollieren und haben Spinner nennen NICHT onItemSelected() nach dem Adapter einstellen?

War es hilfreich?

Lösung

Ich habe diese Lösung nicht für sehr lange noch verwendet, so bin ich nicht ganz sicher, dass es wie erwartet funktioniert, aber ich habe Glück gehabt bisher mit dieser Problemumgehung:

    spinner.setOnItemSelectedListener( new OnItemSelectedListener() {
        protected Adapter initializedAdapter = null;

        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

            // Always ignore the initial selection performed after setAdapter
            if( initializedAdapter !=parent.getAdapter() ) {
                initializedAdapter = parent.getAdapter();
                return;
            }

            ...
        }
    }

Gibt es einen besseren Weg?

Andere Tipps

In Zuhörer Spinner wie unten:

spinner.post(new Runnable(){
    public void run()
    {
        spinner.setOnItemSelectedListener( new OnItemSelectedListener() {

            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                ...
            }
        }
    }
});

Ich habe die Ressource id genannt "spinnerstate".

Dann, wenn ich den Adapter programmatisch festgelegt, stelle ich den „spinnerstate“ Tag „init“, und in dem Ereignis ausgelöst, setzen Sie sich auf „bereit“ und das Ereignis ignorieren. (Man beachte, mein Code ist Mono für Android se wird es anders aussehen):

Set Adapter:

profileSpn.SetTag (Resource.Id.spinnerstate, "init");
profileSpn.Adapter = new ArrayAdapter (this, Android.Resource.Layout.SimpleSpinnerItem, items.ToArray ());

Artikel ausgewählt Ereignis:

    string state = (string)((Spinner)sender).GetTag (Resource.Id.spinnerstate);
    if (state == "init") {
        ((Spinner)sender).SetTag (Resource.Id.spinnerstate, "ready");
        return;
    }

Ich bin damit einverstanden, dass dies nicht das Verhalten in fast 100% der Fälle gewünscht wird, und ich glaube nicht, es ist ein gutes Design auf Seiten von Google, aber es Ihnen geht.

Ich habe ähnliche Dinge vor, ich Zählwert verwendet. Mit Objekt übergeordneter Adapter ist unvollständig, weil es ein Problem sein kann, wenn Ansicht aktualisiert wird oder getView() erneut aufgerufen.

Daher empfehle ich, dass Array des Zählers verwendet wird.

Zuerst definieren Array von Zählung in Adapter global.

private int isInitializedView[];

Und dann initialisieren es auf getView ().

isInitializedView[position] = 0;

Bei der Auswahl Zuhörer, etwas zu tun, dass Sie wollen, wenn sie bereits initialisiert.

    holder.mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            isInitializedView[position]++;
            if(isInitializedView[position] > 1) {
                // do someting that you want
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parentView) {}
    });

(Beachten Sie, dass isInitializedView[position]++; nach if() Routine kommen kann, und nur Triggerereignis, wenn dieser Wert >0. Sie haben die Wahl.)

hatte ich drei Spinner in meiner Tätigkeit und alle Daten Spinner Adapter zur Laufzeit gefüllt worden ist (von Web-Service-Daten nach dem Aufruf von onCreate Methode). So ist es automatisch onItemSelected(AdapterView<?> parent, View view, int position, long id) Methode der Spinner nennen. Ich löste dieses Problem, indem Sie onUserInteraction () Verfahren Aktivität Überprüfen dieses Verfahren, daß Benutzer mit spinner oder nicht interagiert. wenn ja führen Sie dann die Aktion sonst nicht

  1. Declare isUserIntract boolean Variable global

  2. in onItemSelected Verfahren Gebrauch folgende Verfahren

    Wenn (isUserIntract) {

    // Aktion ausführen

    } else {

    // nicht Aktion durchführen

    }

  3. Verwendung unter Code in Aktivität

@Override

public void onUserInteraction() {
super.onUserInteraction();
isUserIntract = true;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top