webentwicklung-frage-antwort-db.com.de

Android: setSelection hat keinen Einfluss auf Spinner

Ich habe ein Problem mit setSelection bei einem Spinner. Ich habe den Wert so eingestellt, dass er vorgewählt wird, wenn der Spinner im Code angezeigt wird, er hat jedoch keine Auswirkungen und die erste Alternative in der Liste ist immer ausgewählt. Der Code sieht so aus: 

    LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final View dialogView = li.inflate(R.layout.edit_event, null);
    ...
    ArrayList<String> routes = new ArrayList<String>();
    // routes filled with values at runtime
    ...
    ArrayAdapter<String> aa = new ArrayAdapter<String>(GOFdroid.this, Android.R.layout.simple_spinner_item, routes);
    aa.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);

    Spinner destSpinner = (Spinner) dialogView.findViewById(R.id.edit_event_destination);

    String dest = events.get(pos).getDestination();
    int routesPos = routes.indexOf(dest);
    Log.d(TAG, "Dest: " + dest + ", pos: " + routesPos);
    destSpinner.setSelection(routesPos);

    destSpinner.setAdapter(aa);

Der Code funktioniert wie vorgesehen, mit Ausnahme des setSelection-Teils, und ich kann einfach nicht verstehen, warum.

Das XML-Layout des Spinners sieht folgendermaßen aus (nicht das gesamte Layout, nur der Spinner-Teil):

// DESTINATION
<TextView
   Android:layout_width="fill_parent"
   Android:layout_height="wrap_content"
   Android:text="Destination:" />
<Spinner
   Android:id="@+id/edit_event_destination"
   Android:layout_width="fill_parent"
   Android:layout_height="wrap_content"
   Android:Prompt="@string/choose_dest"
   Android:layout_marginBottom="10dip"
   Android:text="" />

Hilfe wird sehr geschätzt!

Linus

46
aspartame

Versuchen Sie, den Anruf nach dem Aufruf von setSelection() an setAdapter() zu verschieben.

108
CommonsWare

Ich hatte ein ähnliches Problem. In meinem Fall waren setAdaper und setSelection in der richtigen Reihenfolge! Die ausgeführte Variable onCreate hat funktioniert, aber wenn sie von onResume ausgeführt wurde, hatte sie keine Auswirkung. 

Die Lösung soll setSelection(my_pos, true) aufrufen. Beachten Sie den zweiten Parameter.

65
Greg Dan

Du könntest es versuchen 

mSpinner.post(new Runnable() {        
    public void run() {
      mSpinner.setSelection(1);
    }
  });

dadurch wird die ausführbare Aktion sofort nach dem Erstellen der Ansicht ausgeführt

29
user2532906

In meinem Fall hat keine der Antworten funktioniert, also habe ich die setSelection über einen Handler in eine Warteschlange gestellt

new Handler().postDelayed(new Runnable() {        
    public void run() {
      mSpinner.setSelection(1);
    }
  }, 100);

Dies könnte zu Problemen führen, wenn auf langsamen Geräten ausgeführt wird. Ich arbeite jedoch für ein bestimmtes Gerät. Daher ist es in Ordnung, diesen Hack zu verwenden

21
Maragues

benutze das

    sp2.setAdapter(sp2.getAdapter());
    sp2.getAdapter().notifyDataSetChanged();
    sp2.setSelection(0, false);
1
Ali Bagheri

Spinner.setSelection() funktionieren nicht, wenn Sie es vor Spinner.setAdapter() aufrufen

Versuchen Sie, setSelection() nach dem Aufruf von setAdapter () aufzurufen.

Grund dahinter : Wenn Sie Spinner.Selection() aufrufen, bevor Sie einen Adapter darauf setzen, bedeutet dies einfach, dass Sie versuchen, den Spinner mit setSelection () auf einen benutzerdefinierten Index zu setzen, wenn er keine Daten enthält oder der Spinner max hat item = 0.

setSelection(1) bedeutet das Setzen des Index auf 1 für einen Spinner mit max item = 0; Obwohl der Spinner diesen OutofBoundIndex selbst handhabt, stürzt Ihre App nicht ab.

der Aufruf von SetSelection() sollte nur nach setAdapter () erfolgen

Wenn Sie eine Spinner.SetOnItemSelectedListener() haben und das Problem besteht, dass onItemSelected(AdapterView<?> parent, View view, int position, long id) beim Aktivitätsladen mit dem Positionswert = 0 ausgelöst wird, sollten Sie dieses Muster verwenden.

Spinner.SetAdapter()
Spinner.setSelection();
Spinner.setOnItemSelectedListener();
1
saksham

Die Lösung ist, setSelection (my_pos, true) aufzurufen. Beachten Sie den zweiten Parameter.

Vergessen Sie nicht, wenn Sie animate rufen, richten Sie die Layout-Parameter ein:) Beispiel:

LinearLayout.LayoutParams spinnerLp = (LinearLayout.LayoutParams) spinner.getLayoutParams();
spinner.setSelection(selectedPositionAge, true);
spinnerLp.gravity = Gravity.CENTER;
spinner.setLayoutParams(spinnerLp);

manuell eingestellte Polsterungen an den Spinner müssen manuell zurückgesetzt werden 

1

Ich hatte das gleiche Problem mit einem Spinner in einem fragment : setSelection, der während der onCreate beim ersten Start der Aktivität korrekt funktioniert, aber nicht, wenn ich den Bildschirm drehe. Ich habe es gelöst, indem ich setSelection innerhalb der onViewStateRestored-Methode des Fragments aufrief, anstatt es innerhalb der onCreate-Methode aufzurufen. Ich bin nicht sicher, aber ich denke, Sie können setSelection nicht verwenden, bis die Ansicht vollständig geladen ist, selbst wenn Sie findViewById können.

1
piiiiipppp

Keine der vorherigen Antworten funktionierte für mich. Was jedoch funktioniert hat, war die Instanzvariable mSpinner in der onCreateView()-Methode meines Fragments (oder in der onCreate()-Methode Ihrer Aktivität) zu erstellen und dies dann in meiner onLoadFinished()-Methode durchzuführen ...

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    adapter.swapCursor(cursor);
    //mSpinner.setAdapter(adapter);
    mSpinner.setSelection(mSelectedIndex);
}
1

probiere das, es hat für mich funktioniert:

Spinner destSpinner = (Spinner)dialogView.findViewById(R.id.edit_event_destination);
destSpinner.setSelection(0);
String dest = events.get(pos).getDestination();
int routesPos = routes.indexOf(dest);
destSpinner.setAdapter(aa);
Log.d(TAG, "Dest: " + dest + ", pos: " + routesPos);
destSpinner.setSelection(routesPos);
0
skandhan

Manchmal können wir keine Listener einstellen, da der Spinner möglicherweise auf einen bestimmten Wert eingestellt und je nach Anforderung deaktiviert wird. 

Dies kann dazu führen, dass setSelection () keinen Wert auswählt, da es einen Listener benötigt.

Vergewissern Sie sich, dass setOnItemSelectedListener () des Spinners auf einen benutzerdefinierten Listener wie folgt eingestellt ist.

Selbst wenn der Spinner deaktiviert ist, müssen wir einen Listener wie folgt festlegen, damit die setSelection () -Methode funktioniert.

spinnerListener.setOnItemSelectedListener(spinnerListener);
AdapterView.OnItemSelectedListener spinnerListener = new 
AdapterView.OnItemSelectedListener() 
{
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
      //Your code
    }
}
spinnerListener.setSelection(0);
0
koushick