In der Benutzeroberfläche muss sich ein Drehfeld befinden, das einige Namen enthält (die Namen sind sichtbar), und jeder Name hat eine eigene ID (die IDs entsprechen nicht der Anzeigereihenfolge). Wenn der Benutzer den Namen aus der Liste auswählt, muss die Variable currentID geändert werden.
Die Anwendung enthält die ArrayList
Wobei Benutzer ein Objekt mit ID und Name ist:
public class User{
public int ID;
public String name;
}
Was ich nicht weiß, ist, wie man einen Spinner erstellt, der die Liste der Benutzernamen anzeigt und Spinner-Elemente an IDs bindet. Wenn das Spinner-Element ausgewählt / geändert wird, wird die Variable currentID auf den entsprechenden Wert gesetzt.
Ich würde mich freuen, wenn jemand die Lösung des beschriebenen Problems zeigen oder einen Link zur Lösung des Problems bereitstellen könnte.
Vielen Dank!
Antworten:
Sie können sich diese Antwort ansehen . Sie können auch einen benutzerdefinierten Adapter verwenden, die folgende Lösung ist jedoch für einfache Fälle in Ordnung.
Hier ist ein Re-Post:
Wenn Sie also hierher gekommen sind, weil Sie sowohl Beschriftungen als auch Werte im Spinner haben möchten, habe ich Folgendes getan:
Spinner
gewohntarray.xml
Datei - ein Array für Beschriftungen und ein Array für WerteSpinner
mitandroid:entries="@array/labels"
Wenn Sie einen Wert benötigen, gehen Sie wie folgt vor (nein, Sie müssen ihn nicht verketten):
quelle
Ich weiß, dass der Thread alt ist, aber nur für den Fall ...
Benutzerobjekt:
Benutzerdefinierter Spinner-Adapter (ArrayAdapter)
Und die Umsetzung:
quelle
Skipped 317 frames! The application may be doing too much work on its main thread.
Irgendwelche Ideen?Einfachste Lösung
Nachdem ich verschiedene Lösungen in SO durchsucht hatte, stellte ich fest, dass die folgende Lösung die einfachste und sauberste ist, um eine
Spinner
mit benutzerdefinierten zu füllenObjects
. Hier ist die vollständige Implementierung:User.java
res / layout / spinner.xml
res / layout / your_activity_view.xml
In Ihrer Aktivität
quelle
currentID
sobald sich der Spinner- Wert ändert. Meistens benötigen Sie den Wert des Spinners erst, nachdem Sie anschließend auf eine Schaltfläche wie Senden oder Speichern geklickt haben , nicht unmittelbar nachdem sich der Spinner geändert hat. Wenn dies vermieden werden kann, bietet dies eine viel einfachere Lösung.getSelectedItem()
Anruf darin zu tätigen. Danke für den Tipp.Für einfache Lösungen können Sie einfach den "toString" in Ihrem Objekt überschreiben
und dann können Sie verwenden:
Auf diese Weise zeigt Ihr Spinner nur die Benutzernamen an.
quelle
Mit Abstand der einfachste Weg, den ich gefunden habe:
Jetzt können Sie jedes Objekt in Ihren Spinner stecken und es wird das angegebene Etikett angezeigt.
quelle
Nur eine kleine Änderung an Joaquin Albertos Antwort kann das Stilproblem lösen. Ersetzen Sie einfach die Funktion getDropDownView im benutzerdefinierten Adapter wie folgt.
quelle
Funktioniert gut für mich, der Code, der für das getResource () -Ding benötigt wird, lautet wie folgt:
Sie müssen nur (selbst) sicherstellen, dass die Werte in den beiden Arrays richtig ausgerichtet sind!
quelle
inspiriert von Joaquin Alberto, hat das für mich funktioniert:
quelle
Basierend auf dem Beispiel von Joaquin Alberto (danke), funktioniert es jedoch für jeden Typ (Sie sollten toString () im Typ implementieren, damit Sie die Ausgabe formatieren können.
Ich denke auch, dass Sie List durch Array ersetzen können, damit Sie Array in List nicht ausführen müssen, aber ich hatte eine Liste ..... :)
quelle
Um den Trick zu verstehen, muss man wissen, wie Adapter im Allgemeinen und ArrayAdapter im Besonderen funktionieren.
Adapter: Sind Objekte, die Datenstrukturen an Widgets binden können. Diese Widgets zeigen diese Daten in einer Liste oder in einem Spinner an.
Die beiden Fragen, die ein Adapter beantwortet, sind:
EditText
des Widgets oder der zusammengesetzten Ansicht, gemäß diesen Daten?Die Antworten von ArrayAdapter lauten:
row.xml
ODERandroid.R.layout.simple_spinner_item
) für einen Index ist dasselbe und wird von der Ressource aufgeblasen, deren ID dem Konstruktor von ArrayAdapter zugewiesen wurde..setText()
Methode des Widgets wird mit dem Zeichenfolgenformat des Elements in der unterstützenden Datenstruktur verwendet. Das Zeichenfolgenformat wird durch Aufrufen.toString()
des Elements ermittelt.CustomListViewDemo.java
adaptor_content.xml
main.xml
Es funktioniert richtig, ich hoffe es ist nützlich.
quelle
Mein benutzerdefiniertes Objekt ist
Ich wollte dieses Objekt auch als Adapterquelle für meinen Spinner festlegen , ohne ArrayAdapter so zu erweitern, dass ich es tat.
Jetzt können Sie die Ergebnisse in Ihrem Spinner sehen. Der Trick bestand darin,
toString()
das benutzerdefinierte Objekt zu überschreiben. Welchen Wert Sie auch immer im Spinner anzeigen möchten, geben Sie diesen in dieser Methode zurück.quelle
Ich denke, dass die beste Lösung die "einfachste Lösung" von Josh Pinter ist .
Das hat bei mir funktioniert:
quelle
Wenn Sie keine separate Klasse benötigen, meine ich nur einen einfachen Adapter, der Ihrem Objekt zugeordnet ist. Hier ist mein Code, der auf den bereitgestellten ArrayAdapter-Funktionen basiert.
Und weil Sie möglicherweise nach der Adaptererstellung ein Element hinzufügen müssen (z. B. asynchrones Laden von Datenbankelementen).
Einfach aber effizient.
Und dann können Sie diesen Code verwenden (ich konnte Category [] nicht in den Adapterkonstruktor einfügen, da die Daten separat geladen werden).
Beachten Sie, dass adapter.addAll (items) den Spinner aktualisiert, indem Sie notifyDataSetChanged () in internal aufrufen.
quelle
Machen:
quelle