Frage

Ich habe ein Problem mit setSelection auf einem Spinner. Ich setze den Wert vorausgewählt werden, wenn die Spinner in Code gezeigt wird, aber es hat keine Wirkung und die erste Alternative in der Liste ist immer ausgewählt. Der Code sieht wie folgt 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 als mit Ausnahme des setSelection-Teil vorgesehen, und ich kann einfach nicht herausfinden, warum.

Die XML-Layout des Spinners sieht wie folgt 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

War es hilfreich?

Lösung

Versuchen Sie, den Anruf zu bewegen, um setSelection() nach dem Aufruf von setAdapter().

Andere Tipps

Ich hatte ähnliches Problem. In meinem Fall setAdaper und setSelection waren in der richtigen Reihenfolge! Ausgeführt Form onCreate gearbeitet, aber wenn man von onResume ausgeführt hatte keine Wirkung.

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

Sie könnten versuchen,

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

das wird die runnable Aktion veröffentlichen, sobald die Ansicht ausgeführt wird erstellt

In meinem Fall keine der Antworten gearbeitet, so Warteschlange mir die setSelection durch einen Handler

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

Dadurch könnte zu Problemen führen, wenn sie auf langsame Geräten laufen, aber ich arbeite für ein bestimmtes Gerät, so dass es in Ordnung, diesen Hack verwenden

  
    

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

  

Vergessen Sie nicht, wenn Sie animieren rufen, Setup Layout params dann :) Beispiel:

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

manuell gefasste Polsterungen an Spinnern muss manuell zurückgesetzt

Ich hatte das gleiche Problem mit einem Spinner innerhalb ein fragment : setSelection richtig während der onCreate beim ersten Start der Aktivität funktioniert, aber nicht, wenn ich den Bildschirm drehen. Ich löste es durch setSelection im onViewStateRestored Methode des Fragments aufrufen, anstatt sie im Inneren des onCreate Methode aufrufen. Ich bin nicht sicher, aber ich denke, dass Sie nicht setSelection, bis die Ansicht vollständig geladen ist verwenden können, auch wenn Sie es findViewById können.

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

Versuchen setSelection() nach dem Aufruf setAdapter () aufrufen.

Grund für dieses : wenn Sie anrufen Spinner.Selection() bevor Sie einen Adapter einstellen, um es einfach bedeutet, dass Sie Spinner, um benutzerdefinierten Index von setSelection einzustellen versuchen (), wenn es keine Daten enthält, oder uns kann sagen, das ist Spinner max Element hat = 0 ist.

so bedeutet setSelection(1) Einstellung Index für Spinner zu 1, die max Element hat = 0; Obwohl Spinner selbst diese outofBoundIndex behandelt, so dass Ihre App nicht abstürzt.

rufen nach setAdapter SetSelection() sein sollte () nur

Auch wenn Sie eine Spinner.SetOnItemSelectedListener() und Sie haben Problem, dass onItemSelected(AdapterView<?> parent, View view, int position, long id) mit Positionswert = 0, wenn die Aktivität Last tiggered wird und dann sollten Sie dieses Muster verwenden.

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

verwenden diese

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

Keine der bisherigen Antworten für mich gearbeitet. Was funktioniert hat, obwohl, war die Instanz-Variable mSpinner im onCreateView() Methode meines Fragments (oder in der onCreate() Methode Ihrer Aktivität) zu schaffen, dann ist diese Methode in meinem onLoadFinished() tun ...

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

versuchen, dies, ist es für mich gearbeitet:

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

Manchmal können wir nicht Hörer eingestellt, da der Spinner kann auf einen bestimmten Wert, und deaktiviert je nach Anforderung eingestellt werden.

Dies kann zu setSelection führen () keinen Wert Auswahl, da er einen Zuhörer muss.

Stellen Sie sicher, dass der Spinner setOnItemSelectedListener () zu einem benutzerdefinierten Hörer wie unten festgelegt ist.

Auch wenn Spinner deaktiviert sind, wir einen Hörer wie unten setzen müssen, so dass 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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top