Android: setSelection keine Auswirkungen auf Spinner mit
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
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);